当前位置: 首页 > 面试题库 >

检测可点击项目的猛扑手势

曾高杰
2023-03-14
问题内容

想象一下带有4个按钮的布局

 _______________________________
|              |                |
|      A       |       B        |
|______________|________________|
|              |                |
|      C       |       D        |
|______________|________________|

我想在整个布局上检测击退手势,但是当击退开始时未检测到按钮。

我正在使用:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gesturedetector= new GestureDetector(this, this);

    findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.e("","TouchEvent");
            return gesturedetector.onTouchEvent(event);
        }
    });
}

如果没有可点击的项目,则失败,但如果猛击开始于可点击的项目,则失败。

我该如何解决?悬赏50分可获得完整的工作答案


问题答案:

我实现这一目标的一种方法是重写以下方法:

public boolean onInterceptTouchEvent(MotionEvent event){
    super.onInterceptTouchEvent(event);
    ...

您可以在布局容器中覆盖此方法(例如,ViewGroup或按住按钮的任何对象),然后继续false从该方法返回以“拦截”子项View(例如,按钮)消耗的触摸事件。然后,在该重写的方法中,您可以使用MotionEvents
调用手势检测器对象。该方法还“看到”以ViewGroup自身为目标的事件,这意味着-如果我没记错的话-您 只需
要从该方法中调用手势检测器,这样做,手势检测器将“查看” 所有内容
事件,无论它们是否在按钮上方。因此,如果您从一个按钮开始拖动手指,然后在布局背景上的某个点结束拖动手指,则手势检测器应该可以看到整个滑动。您不需要向手势检测器提供来自布局本身的事件,onTouchEvent()因为它已经看到了它们。


第二种方式:

我只是查看了我在其中使用过此项目的项目,并意识到我切换到了另一种方式。我实际上所做的是我设计了所有的子对象View,以便父代Activity(或包含ViewGroup)可以向所有这些子对象注册相同的手势检测器对象View(我的每个特殊对象View都有一个称为的方法registerGestureDetector())。然后,在我的孩子Views中被覆盖的“
onTouchEvent()”中,将MotionEvents
传递给已向其注册的手势检测器View。换句话说,父级ViewGroup布局和所有子级View仅共享同一手势检测器。

我意识到这听起来有点麻烦,并且考虑到可以使用来完成onInterceptTouchEvent(),但没有必要,但是我的应用程序处理了一些非常复杂的规则,涉及到我View需要如何响应触摸事件和手势,因此我可以应用一些规则。我需要针对我的应用程序的其他逻辑。但是,我在这两种方法中都达到了相同的基本目标:MotionEvent将以Views为目标的s
引导到同一手势检测器对象。



 类似资料:
  • 注:此具体问题已解决,但存在严重的后续问题。查看GestureDetector-在GridView项目中双击Detect,但在onTouchEvent()中返回false 我想检测图像的< code>GridView中不同项目的双击。因此,我为适配器的< code>getView()方法中的每个项目< code>imageView分配了一个单独的< code>OnTouchListener。< c

  • 我想知道如何编写代码来检测鼠标点击精灵。例如:

  • 问题内容: 如何检测元素外部的点击?我正在使用Vue.js,因此它将不在我的模板元素之外。我知道如何在Vanilla JS中做到这一点,但是当我使用Vue.js时,我不确定是否有更合适的方法来做到这一点? 我想我可以使用更好的方法来访问元素? 问题答案: 只需设置一次自定义指令即可很好地解决: 用法: 在组件中:

  • 问题内容: 我正在寻找一种检测点击事件是否在组件外部发生的方法。jQuery最近的()用于查看click事件中的目标是否具有dom元素作为其父元素之一。如果存在匹配项,则单击事件属于子项之一,因此不被视为在组件之外。 因此,在我的组件中,我想将单击处理程序附加到窗口。当处理程序触发时,我需要将目标与组件的dom子代进行比较。 click事件包含“path”之类的属性,该属性似乎包含事件经过的dom

  • 问题内容: 我了解,如果是跨域用户,则无法判断用户在做什么。我想做的是跟踪用户是否完全单击。我想象一个场景,在之上不可见,而the 会随后将click事件传递给。 这样的事情可能吗?如果是的话,我将如何处理?的是广告,所以我必须在所使用的标签没有控制权。 问题答案: 这样的事情可能吗? 否。您所能做的就是检测鼠标进入iframe的可能性,以及检测到鼠标进入iframe的可能性(尽管不可靠)(即,试

  • 我有一个listView,它充满了字符串的数组列表,我想让它可点击...但我无法识别哪个项目被点击了 我做了这个,但没用! 有办法知道被点击的字符串吗?如果没有,是否有办法知道被点击项目的位置?