0

我正在创建启动服务的 android 活动。该服务旨在接收触摸事件,即使用户正在使用其他应用程序。它的 onCreate() 方法如下。公共无效 onCreate() {

    super.onCreate(); 
    // create linear layout
    touchLayout = new LinearLayout(this);
    // set layout width 30 px and height is equal to full screen
    LayoutParams lp = new LayoutParams(30, LayoutParams.MATCH_PARENT);
    touchLayout.setLayoutParams(lp);
    // set color if you want layout visible on screen
    //touchLayout.setBackgroundColor(Color.CYAN); 
    // set on touch listener
    touchLayout.setOnTouchListener(this);

    // fetch window manager object 
     mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
     // set layout parameter of window manager
     WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
                //30, // width of layout 30 px
             WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT, // height is equal to full screen
                WindowManager.LayoutParams.TYPE_PHONE, // Type Ohone, These are non-application windows providing user interaction with the phone (in particular incoming calls).
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  , // this window won't ever get key input focus  
                PixelFormat.TRANSLUCENT);      
     mParams.gravity = Gravity.LEFT | Gravity.TOP;   
    Log.i(TAG, "add View");

     mWindowManager.addView(touchLayout, mParams);

}

上面我正在创建一个跨越屏幕全高和全宽的窗口。我已将其设置为监听触摸事件。但是这样做会阻止其他应用程序接收触摸事件。因此,我希望将在我的服务上收到的这些触摸事件发送到放置我的窗口的后台应用程序。

请帮忙 !

4

1 回答 1

0

桑迪普,

将覆盖视图添加到窗口管理器会自动将该视图放置在该窗口的视图层次结构的顶部,这意味着它将拦截触摸而不是其后面的视图。它后面的视图接收触摸事件的唯一方法是让用户在顶视图之外触摸(这是不可能的,因为它跨越了整个屏幕),或者顶视图将自己标记为“不可触摸”。

因此,要么限制视图的大小,要么将标志 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 添加到参数标志中。

在任何一种情况下,除非用户当前将您的应用程序置于前台,否则您视图之外的任何触摸事件都将返回 ACTION_OUTSIDE 触摸事件,但触摸位置上没有任何坐标。(如果用户确实将您的应用程序放在前台,那么您将收到带有 ACTION_OUTSIDE 事件的坐标。)

于 2014-07-03T01:57:45.407 回答