安卓:透明视图无法正确处理触摸事件

3

我希望在我的应用程序上方拥有一个透明的视图。
我只需要知道当前的活动即可实现这一点。
通过windowManager添加一个新的framelayout,我找到了一种方法来实现这一点。我正在做以下操作:

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中无法正确接收触摸事件,同时在我的视图后面的应用程序中也无法接收。

1个回答

2
尚未测试。但是,想法是您需要通过触摸事件向下传递。由于假定您的顶级(实际上是顶级)视图处理了该事件,因此您可能需要将您的透明帧布局设置为处理触摸事件(如果适用,则还要处理其他事件)。
==更新==
您应该继承FrameLayout并创建自己的透明布局,然后指示它监视并绕过触摸事件。参考资料

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

  1. 您将在此处收到向下事件。
  2. 向下事件将由此视图组的子项处理,或者交给您自己的onTouchEvent()方法来处理;这意味着您应该实现onTouchEvent()以返回true,以便您将继续看到其余的手势(而不是寻找父视图来处理它)。此外,通过从onTouchEvent()返回true,您将不会在onInterceptTouchEvent()中接收任何后续事件,并且所有触摸处理必须像正常情况下一样在onTouchEvent()中进行。
  3. 只要您从此函数返回false,每个随后的事件(直到包括最终up)都将首先传递到此处,然后传递给目标的onTouchEvent()。
  4. 如果您从此处返回true,则不会收到任何后续事件:目标视图将接收相同的事件,但其操作为ACTION_CANCEL,并且所有后续事件都将传递到您的onTouchEvent()方法中,不再出现在此处。
==更新==
顺便说一句,您应该使用自定义的帧布局(或其他适合您的布局)来“容纳”其他子项。我建议您可以将其用作根布局。

你好,感谢您的回复。我尝试了您建议的方法,但事件没有传递下去。如果我进行调试,在每个触摸事件(就像您提到的那样)时,我都传递了false,但是后面的视图没有收到任何东西。您能帮助我吗? - user468488
应该使用ViewGroup.onInterceptTouchEvent。我已经更新了答案。 - xandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接