Android:透明视图无法正确管理touchevent

时间:2010-10-25 03:31:33

标签: android view transparent

我希望在我的申请之上有一个透明的视图 我想知道当前的活动,这样做 我找到了一种方法,通过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,同时在我的视图后面的应用程序中也是如此。

1 个答案:

答案 0 :(得分:2)

尚未测试过。但这个想法是你需要通过触摸事件来解决问题。由于假设您的顶级(实际上是顶部)视图处理了该事件,您可能需要将透明framelayout设置为 NOT 处理触摸事件(以及其他事件,如果适用)。

==更新==

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

  

实施此方法以拦截所有触摸屏动作事件。这允许您在将事件发送给您的孩子时观察事件,并在任何时候获取当前手势的所有权。使用此函数需要注意,因为它与View.onTouchEvent(MotionEvent)的交互相当复杂,并且使用它需要以正确的方式实现该方法以及此方法。活动将按以下顺序收到:

     
      
  1. 您将收到此次活动。
  2.   
  3. down事件将由此视图组的子进程处理,或者由您自己的onTouchEvent()方法处理;这意味着你应该实现onTouchEvent()以返回true,这样你将继续看到手势的其余部分(而不是寻找父视图来处理它)。此外,通过从onTouchEvent()返回true,您将不会在onInterceptTouchEvent()中收到任何后续事件,并且所有触摸处理必须像on normal一样在onTouchEvent()中进行。
  4.   
  5. 只要你从这个函数返回false,每个后续事件(包括最后一个)将首先在这里传递给目标的onTouchEvent()。
  6.   
  7. 如果从此处返回true,则不会收到任何后续事件:目标视图将收到相同的事件,但行动为ACTION_CANCEL,所有其他事件将传递给您的onTouchEvent()方法,此处不再显示。
  8.   

== UPDATE ==

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