我想在我的应用程序上方有一个透明的视图。
我只想知道当前活动就可以这样做。
我找到了一种通过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/