我有一个启动系统覆盖的服务。当叠加层可见时,我想让它成为可触摸/检测触摸,但我希望保持与它背后的屏幕的交互(后面是指底层活动,例如叠加层旁边)。
我的叠加层是128x128px的位图/ PNG。它被绘制,当我点击它时,我收到了触摸!记录,这很好。 但是当我点击屏幕的任何其他部分(除了叠加层)之外,我得到了触摸!记录并且无法与其下方的屏幕进行交互。
以下是我的代码部分:
主要活动启动服务
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// start Service and return to Homescreen
Intent i = new Intent(MainActivity.this, MyService.class);
startService(i);
Intent newActivity = new Intent(Intent.ACTION_MAIN);
newActivity.addCategory(Intent.CATEGORY_HOME);
newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newActivity);
}
});
服务/显示覆盖
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myOverlay = new Overlay(MyService.this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(myOverlay, params);
myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
myOverlay.postInvalidate();
return super.onStartCommand(intent, flags, startId);
}
覆盖
public MyOverlay(Context context) {
super(context);
this.context = context;
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY());
return false;
}
});
}
我究竟做错了什么?还尝试了WindowManager.LayoutParams.TYPE_PHONE而不是WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,但行为相同。
我没有使用Flag FLAG_WATCH_OUTSIDE_TOUCH,那么为什么覆盖层旁边没有注册触摸?
编辑
好像我发现了问题,但仍然不知道如何解决它... 叠加中显示的图像非常小而不是问题,但叠加本身是全屏(!)
我将以下日志添加到Overlay / onTouch()事件:
Log.i("TOUCH!", "View: "+v.toString() +", size="+ v.getWidth()+"/"+v.getHeight());
然后告诉我View:package.overlay.myOverlay, 大小=762分之480
现在我试图通过在服务中添加以下行来强制它不是全屏:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myOverlay = new Overlay(MyService.this);
//HERE
myOVerlay.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(myOverlay, params);
myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
myOverlay.postInvalidate();
return super.onStartCommand(intent, flags, startId);
}
但它没有帮助...仍然myOverlay的大小为480x762 ...为什么它那么大,我怎么能得到它的大小包含图像?