Android中是否有合法的方式来监听用户所做的所有触摸事件,甚至在我的应用之外。我的意思是有类似于在后台监听屏幕手势的服务。
答案 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/