我的意图:
监听任何用户对任何活动的输入,与它是什么类型的手势或触摸事件无关。
我尝试的解决方案
创建了一个透明的自定义视图,使用 TYPE_SYSTEM_ALERT 所以它总是在顶部,以及其他标志(我认为会)允许触摸到它下面的视图。
我的问题:
手势不会“通过”其他视图,包括家庭活动。目前,日志正确触发,我可以使用最近的列表交换应用程序,但实际上无法与它们交互。
编辑:刚刚发现这非常令人沮丧。
...从 Android 4.0.3 开始,这不再可能,以防止窃听攻击,至少对于覆盖层本身的触摸。叠加层可以接收触摸事件(并且那些不被转发)或不接收触摸事件。
还有其他可能的解决方案吗?我不需要知道触摸事件的细节,只是知道发生了某种事件。
@Override
public void onCreate(){
super.onCreate();
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
gestureDetector = new GestureDetector(this, new GestureListener());
View.OnTouchListener gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
ViewG overlayView = new ViewG(this);
wm.addView(overlayView, params);
overlayView.setOnTouchListener(gestureListener);
}
public class ViewG extends ViewGroup{
ViewG(Context context){
super(context);
}
@Override
public void onLayout(boolean bool, int a, int b, int c, int d){
}
}
public class GestureListener extends SimpleOnGestureListener implements
OnGestureListener {
public GestureListener() {
// TODO Auto-generated constructor stub
}
@Override
public boolean onDown(MotionEvent e){
Log.v("JTAG","Stop Touching Me");
return false;
}
}