我想在我的应用程序上方有一个透明的视图。
我只想知道当前活动就可以这样做。
我找到了一种通过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中以及在视图后面的应用程序中同时正确接收touchevent。

最佳答案

尚未测试。但想法是您需要将触摸事件传递下去。由于假定您的顶层(实际上是顶层)视图已处理该事件,因此您可能需要将透明的框架布局设置为不处理触摸事件(以及其他事件,如果适用)。

==更新==

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


  实现此方法以拦截所有触摸屏运动事件。这样,您就可以在事件被分派给孩子时观看,并随时掌握当前手势的所有权。使用此函数需要格外小心,因为它与View.onTouchEvent(MotionEvent)的交互非常复杂,并且使用它需要以正确的方式实现该方法以及该方法。将按照以下顺序接收事件:
  
  
  您将在此处收到下降事件。
  down事件将由该视图组的子项处理,或由您自己的onTouchEvent()方法处理;这意味着您应该实现onTouchEvent()以返回true,因此您将继续查看其余手势(而不是寻找父视图来处理该手势)。另外,通过从onTouchEvent()返回true,您将不会在onInterceptTouchEvent()中收到任何后续事件,并且所有触摸处理都必须像平常一样在onTouchEvent()中进行。
  只要您从此函数返回false,随后的每个事件(直至并包括最终的up)将首先在此处传递,然后传递到目标的onTouchEvent()。
  如果从此处返回true,则将不会收到以下任何事件:目标视图将接收到相同的事件,但动作为ACTION_CANCEL,并且所有其他事件将传递到您的onTouchEvent()方法,并且不再出现在这里。
  


==更新==

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

关于android - Android:透明 View 无法正确管理touchEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4011738/

10-16 22:17