Android覆盖来抓住所有的触摸,并传递给他们?

我基本上是想从类似系统覆盖的东西中获取所有的触摸事件数据,基于这个触摸数据移动我的精灵,然后允许OS /主屏幕/浏览器根据数据进行操作(反之亦然)。 我发现了类似的问题,但是没有任何东西可以引导我,

获取正在接收所有触摸事件的视图

(已实现,结果如下) 创build一个系统覆盖窗口(总是在最上面)

我可以做什么:

我可以抓住所有的触摸事件,并通过移动我的精灵,而不是让操作系统/主屏幕/浏览器看到任何触摸事件,或者,也可以让触摸事件通过,只获得“TOUCH_OUTSIDE”为我的应用程序采取行动。

我未达到的目标:

我不能为了我的生活找出一个办法来处理数据。 我能想到的唯一的方法,我不能实现的是:拦截我的APP中的数据,并将其传递到OS / homescreen /浏览器来使用允许操作系统/主屏幕/浏览器首先获取数据,然后以某种方式获取信息的callback允许操作系统/主屏幕/浏览器获取数据,对数据采取行动,并轮询他们的滚动/位置值,以便在我的APP中对其执行操作。

我担心这是不可能的,我想我现在在某些文档中读到一些我现在找不到的文档:“这是全部或者全部,或者你的观点得到所有事件,或者没有一个”

(为了避免混淆,我并不是说我有两个意见,我的意思是我有一个视图,通过覆盖OS / homescreen / browser的活动/服务来控制,如果你愿意的话,就像一个玻璃窗。

感谢您提供任何有用的信息,非常感谢!

[更新]在下面发表我自己的文件,以免混淆。

发现这个文档几乎说明不能同时执行这两个操作: Android:Multi touch和TYPE_SYSTEM_OVERLAY

他们讨论解决方法,但我不认为他们中的任何一个实际上会为我正在尝试做的工作。 两者都将事件提供给底层应用程序,并能够窥探他们为我自己采取行动。

要创build叠加视图,在设置LayoutParams时,需要将types设置为TYPE_SYSTEM_OVERLAY并使用标志FLAG_WATCH_OUTSIDE_TOUCH。 这就产生了一个问题,因为Android的文档指出:“你将不会收到完整的向下/向上/向上的手势,只有第一个向下的位置作为ACTION_OUTSIDE。 为了接收完整的触摸事件数组,您需要使用TYPE_SYSTEM_ALERTtypes,但这将导致覆盖层接pipe屏幕并停止与其他元素的交互。

任何人都不同意我喜欢听到好消息:-D

你可以使用GestureOverlayView,如果你想隐藏它所画的线条,你可以将颜色设置为Transparent#00000000,这样它就不会出现,然后你可以捕捉到所有的触摸和手势。

http://developer.android.com/resources/articles/gestures.html

这不是最佳的解决scheme,但它的工作原理。 重新启动服务切换标志不可触摸。 把布尔额外的意图,这是用来启动服务来确定以前的状态切换值。 更好的实施方式是在窗口正在监听时触发意图触发,并且在不侦听的固定时间之后触发。

public class bleh extends Service { public void onCteqwer(int i) { Context context; Class <bleh> context1 = bleh.class; WindowManager.LayoutParams params = null; WindowManager mang = (WindowManager) getSystemService(WINDOW_SERVICE); //check previous state of service if(i==0) params = new WindowManager.LayoutParams(arg0,arg1,arg2,arg3,arg4,arg5); if(i==1) params = new WindowManager.LayoutParams (WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,arg0,arg1,arg2,arg3,arg4); LayoutInflater inflater = (LayoutInflater) getSystemService (LAYOUT_INFLATER_SERVICE); View mViw = inflater.inflate(arg, null); mViw.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); mang.addView(mViw, params); Intent z = new Intent(context, context1); if(i==0) z.putExtra("name", 1); if(i==1) z.putExtra("name", 0); stopSelf(); startService(z); } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Bundle i=intent.getExtras(); int userName = 0; if (i != null) { userName = i.getInt("name"); onCteqwer(userName); } }