在后台聆听触摸事件

时间:2016-05-25 09:21:36

标签: android background listener gesture touch-event

Android中是否有合法的方式来监听用户所做的所有触摸事件,甚至在我的应用之外。我的意思是有类似于在后台监听屏幕手势的服务。

1 个答案:

答案 0 :(得分:-1)

这个想法是定义一个非常小的虚拟UI片段(例如,1x1像素),并将其放置在屏幕的一个角上,让它听取它外面的所有触摸事件。嗯,从字面上看,它不是"看不见的",事实上它一直在前景!但由于它非常小,所以希望用户不会感到有所不同。

首先,让我们创建这个虚拟视图:

mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mDummyView = new LinearLayout(mContext);

LayoutParams params = new LayoutParams(1, LayoutParams.MATCH_PARENT);
mDummyView.setLayoutParams(params);
mDummyView.setOnTouchListener(this);

这里我们将虚拟视图的宽度设置为1像素,将高度设置为父高度。我们还设置了一个触摸事件监听这个虚拟视图,我们将在稍后实现。

然后让我们添加这个虚拟视图。

LayoutParams params = new LayoutParams(
    1, /* width */
    1, /* height */
    LayoutParams.TYPE_PHONE,
    LayoutParams.FLAG_NOT_FOCUSABLE | 
    LayoutParams.FLAG_NOT_TOUCH_MODAL |
    LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
    PixelFormat.TRANSPARENT
    );
params.gravity = Gravity.LEFT | Gravity.TOP;
mWindowManager.addView(mDummyView, params);

这里的关键是FLAG_WATCH_OUTSIDE_TOUCH标志,它使虚拟视图能够捕获屏幕上的所有事件,无论事件是否在虚拟视图内。

最后,让我们通过实现View.OnTouchListener监听器来处理触摸事件。

@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "Touch event: " + event.toString());

// log it

return false;
}

我们需要返回false,因为我们并没有真正处理事件,因此底层的真实UI元素可以获取这些事件。

最后要注意的是,为了保持我们的虚拟视图始终监听触摸事件,我们需要将所有这些包装在服务中:我们在onCreate中创建虚拟视图并将其添加到onStartCommand中的屏幕。该服务应实现View.OnTouchListener以接收触摸事件。

Referrence 我从这里得到了这个 http://jhshi.me/2014/11/09/monitor-screen-touch-event-in-android/