【问题标题】:Android : transparent view does not manage touchevent correctlyAndroid:透明视图无法正确管理触摸事件
【发布时间】:2012-02-08 20:52:53
【问题描述】:

我希望在我的应用程序上方有一个透明视图。
我只想知道当前的活动就想这样做。
我找到了一种通过 windowManager 添加新框架布局的方法 我正在这样做:

public static void AddViewAbove(Activity activity) {
    FrameLayout newLayout = new FrameLayout(activity);

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,
    WindowManager.LayoutParams.TYPE_APPLICATION,
    // if I let WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE   
    // then touchevent are passed to the application behind, but I cant handle touch in
    // my new frameLayout
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT);
    activity.getWindowManager().addView(newLayout , lp);

}

我现在的主要问题是我无法在我的新 FrameLayout 中以及同时在我的视图后面的应用程序中正确接收 touchevent。

【问题讨论】:

    标签: android view transparent


    【解决方案1】:

    尚未测试。但是这个想法是你需要通过触摸事件向下传递。由于假定您的顶级(实际上是顶级)视图处理了事件,您可能需要将透明框架布局设置为不处理触摸事件(和其他事件,如果适用)。

    ==更新==

    您应该继承 FrameLayout 并创建自己的透明布局。然后指示它监视并绕过触摸事件。 Reference

    实现此方法以拦截所有触摸屏运动事件。这使您可以在事件被分派给您的孩子时观看它们,并在任何时候获得当前手势的所有权。使用这个函数需要小心,因为它与 View.onTouchEvent(MotionEvent) 的交互相当复杂,并且使用它需要以正确的方式实现该方法以及该方法。事件将按以下顺序接收:

    1. 您将在此处收到 down 事件。
    2. down 事件将由该视图组的子级处理,或者交给您自己的 onTouchEvent() 方法处理;这意味着您应该实现 onTouchEvent() 以返回 true,因此您将继续看到手势的其余部分(而不是寻找父视图来处理它)。此外,通过从 onTouchEvent() 返回 true,您将不会在 onInterceptTouchEvent() 中收到任何后续事件,并且所有触摸处理都必须像往常一样在 onTouchEvent() 中发生。
    3. 只要您从此函数返回 false,每个后续事件(直到并包括最后的 up)都将首先传递到这里,然后传递到目标的 onTouchEvent()。
    4. 如果您从这里返回 true,您将不会收到任何以下事件:目标视图将收到相同的事件,但带有操作 ACTION_CANCEL,并且所有进一步的事件将被传递到您的 onTouchEvent() 方法并且不再出现在这里.

    ==更新==

    顺便说一句,您应该使用自定义框架布局(或其他适合您的布局)来“保持”另一个孩子。我建议你可以使用它作为你的根布局。

    【讨论】:

    • 您好,感谢您的回复,我尝试了您的建议,但事件没有传递。如果我调试,在每个触摸事件(如你提到的)我传递错误,但背后的视图没有收到任何东西。你能帮我吗?
    • 它应该使用 ViewGroup.onInterceptTouchEvent 代替。我更新了答案
    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2021-04-29
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多