OnTouch 正在返回 "false" 但触摸事件未传递到基础视图
OnTouch is returning "false" but touch event is not passing to underlying view
一个服务是从 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。
但事实并非如此。可能是什么原因?
我认为控件不应移至后台 MainActivity - 这将是 主要 安全风险,因为您将能够实现类似触摸事件记录器的功能。一旦有了记录的触摸事件列表,就可以将它们映射到单独的键盘键的坐标并泄露用户密码!
OS 的行为完全没有意义。
由于该服务不是您 activity 的一部分,您进入其中的所有事件都不会到达 activity。如果你想要的只是让事件通过,你可以通过让你的新图层不可触摸来实现:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
但是您必须考虑到您不会在侦听器中获取事件。
一个服务是从 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。 但事实并非如此。可能是什么原因?
我认为控件不应移至后台 MainActivity - 这将是 主要 安全风险,因为您将能够实现类似触摸事件记录器的功能。一旦有了记录的触摸事件列表,就可以将它们映射到单独的键盘键的坐标并泄露用户密码!
OS 的行为完全没有意义。
由于该服务不是您 activity 的一部分,您进入其中的所有事件都不会到达 activity。如果你想要的只是让事件通过,你可以通过让你的新图层不可触摸来实现:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
但是您必须考虑到您不会在侦听器中获取事件。