OnTouch返回“false”但触摸事件未传递给基础视图

时间:2015-06-16 13:06:12

标签: java android android-layout layout service

从MainActivity

启动一项服务
public void buttonClicked(View v){
    //method to call after button is clicked in MainActivity

    if(v.getTag() == null){
        globalService = new Intent(this,GlobalTouchService.class);
        startService(globalService);//start the service
        v.setTag("on");
        Toast.makeText(this, "Start Service", Toast.LENGTH_SHORT).show();
    }
    else{
        stopService(globalService);
        v.setTag(null);
        Toast.makeText(this, "Stop Service", Toast.LENGTH_SHORT).show();
    }

}

在服务的OnCreate内部,创建一个透明布局并实现Touch Listener。

public class GlobalService extends Service{
 @Override
public void onCreate() {
    super.onCreate();
    // create linear layout
        touchLayout = new LinearLayout(this);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    touchLayout.setLayoutParams(lp);
    // 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(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT, 
            WindowManager.LayoutParams.TYPE_PHONE, 
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    mParams.gravity = Gravity.LEFT | Gravity.TOP;


    mWindowManager.addView(touchLayout, mParams);
     touchLayout.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
                System.out.println("Action :" + event.getAction() + "\t X :" + event.getRawX() + "\t Y :"+ event.getRawY());

            return false;
        }
    });


}

由于onTouch返回false,当我们单击透明布局上方时,控件应移动到背景MainActivity。 但事实并非如此。可能是什么原因?

2 个答案:

答案 0 :(得分:2)

我不认为控件应该转移到后台MainActivity - 这将是 主要 安全风险,因为您可以实现某些功能像触摸事件记录器。获得已记录的触摸事件列表后,您可以将它们映射到单独键盘键的坐标并泄漏用户的密码!

操作系统以这种方式行事绝对没有意义。

答案 1 :(得分:0)

由于服务不属于您的活动,因此您收到的所有活动都无法进入活动。如果您想要的只是让事件通过,您可以通过使新图层不可触摸来实现:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

但是你必须考虑到你赢得在听众中获取事件。