获取GestureDetector触及的视图

时间:2013-07-24 13:47:54

标签: android android-event android-gesture

我已在GestureDetector中实施Activity。现在我可以从整个屏幕抓取所有事件,例如onSingleTapConfirmedonDoubleTaponLongPress ......

是否可以检测到我的自定义布局中的哪个View被按下了?

1 个答案:

答案 0 :(得分:1)

在Android中,您拥有平台源代码,因此我建议您查看核心ViewGroup的实现方式并从中学习。

让我们检查ViewGroup可用here的来源。寻找函数dispatchTouchEvent()。它完全符合你的目标。

要确定实际点击了哪个视图,它会遍历所有子视图,请求每个视图的hitrect并检查它是否相关。代码:

for (int i = count - 1; i >= 0; i--) {
   final View child = children[i];
   if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 
       || child.getAnimation() != null) {
       child.getHitRect(frame);
       if (frame.contains(scrolledXInt, scrolledYInt)) {

我只能建议你做类似的事情。

我想你不会想要进行这种手动迭代(或递归,因为你可能想进入视图中的视图),因为,让我们面对它,这是非常令人作呕的。在这种情况下,也许您可​​以让常规机制发挥其魅力(让事件像往常一样流入子视图)。然后在要处理的特定视图上设置事件处理程序,并调用您的处理程序并以某种方式通知您哪个视图被点击。

要记住的另一个有趣的事情是自定义布局可以使用ViewGroup.setStaticTransformationsEnabled()为其子视图实现静态转换。当我实现了3D视图轮播时,我使用了这些转换。在这种情况下,我很确定你想做什么是不可能的。子视图并不真正知道它们的位置,因为静态转换将它们绘制在屏幕上的其他位置。在这种情况下,您处于自定义布局的优雅之下,可以为您正确地将事件分派到其子视图。