1

我的意图:
监听任何用户对任何活动的输入,与它是什么类型的手势或触摸事件无关。

我尝试的解决方案
创建了一个透明的自定义视图,使用 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;
    }
}
4

0 回答 0