Android 将触摸事件从覆盖视图发送到后台
我有以下服务,可以在系统中的每个应用程序上显示覆盖视图,并获取触摸事件。由于类型_系统_警报,触摸无法进入后台,因此没有任何用处。我想我可以获得一个MotionEvent并使用我刚刚检测到的相同的x,y将其发送到背景视图 **问题:如何定义将事件发送到的背景视图?。鉴于我可以随时检测前台应用程序是什么,我是否可以定义该窗口的视图以便分派事件Android 将触摸事件从覆盖视图发送到后台,android,overlay,touch-event,dispatch,Android,Overlay,Touch Event,Dispatch,我有以下服务,可以在系统中的每个应用程序上显示覆盖视图,并获取触摸事件。由于类型_系统_警报,触摸无法进入后台,因此没有任何用处。我想我可以获得一个MotionEvent并使用我刚刚检测到的相同的x,y将其发送到背景视图 **问题:如何定义将事件发送到的背景视图?。鉴于我可以随时检测前台应用程序是什么,我是否可以定义该窗口的视图以便分派事件 public class OverlayService extends Service { LinearLayout oView; @O
public class OverlayService extends Service {
LinearLayout oView;
@Override
public IBinder onBind(Intent i) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
oView = new LinearLayout(this);
oView.setBackgroundColor(0x88ff0000); // The translucent red color
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
0 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(oView, params);
oView.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("Recycle")
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
int x = (int) event.getX();
int y = (int) event.getY();
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
downTime,
eventTime,
MotionEvent.ACTION_DOWN,
x,
y,
metaState
);
Toast.makeText(getBaseContext(), Integer.toString(x)+" "+Integer.toString(y), Toast.LENGTH_SHORT).show();
// Dispatch touch event to background
// ?
// ?
// Dispatch touch event to background
}
// Obtain MotionEvent object
return false;
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
if(oView!=null){
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.removeView(oView);
}
}
}
幸运的是,这是不可能的。GMD手势控制可以做到这一点。至于令人惊讶的评论:并不是每个人都有不好的意图。@user3051067:你找到解决方案了吗?不幸的是,没有……GMD使用root访问来解决这个问题。如果没有根访问权限,我认为这是不可能的。如果我没有根访问权限,该怎么做?