5

我已经GestureDetector在我的Activity. 现在我可以从整个屏幕上抓取所有事件,比如onSingleTapConfirmed, onDoubleTap, onLongPress...

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

4

1 回答 1

1

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

让我们在此处检查ViewGroup可用的来源。寻找功能。它几乎可以完成您想要做的事情。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 视图轮播时使用了这些转换。在这种情况下,我很确定您想要做的事情是不可能的。子视图并不真正知道它们在哪里,因为静态转换将它们绘制在屏幕上的其他位置。在这种情况下,您可以在自定义布局的恩典下为您正确地将事件分派到其子视图。

于 2013-07-24T14:26:14.023 回答