【问题标题】:Obtain view that is touched with GestureDetector获取使用 GestureDetector 触摸的视图
【发布时间】:2013-07-24 01:00:36
【问题描述】:

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

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

【问题讨论】:

    标签: android android-event android-gesture


    【解决方案1】:

    在 Android 中你有平台源代码,所以我建议你看看核心 ViewGroups 是如何实现的并从中学习。

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

    【讨论】:

    • 第二种解决方案似乎更好。我会尽量走这条路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多