我基本上是试图从系统覆盖的东西中获取所有的触摸事件数据,基于这些触摸数据移动我的精灵,然后允许OS/homescreen/browser按照它应该的方式操作这些数据(反之亦然)。我也发现了类似的问题,但没有什么能让我找到我没有去过的地方:
Getting the View that is receiving all the touch events
(已实现,结果如下) Creating a system overlay window (always on top)
我能做什么:
我可以抓取所有的触摸事件并通过移动精灵来处理它们,而不允许OS/homescreen/browser看到它们中的任何一个,或者我可以允许触摸事件通过并只获得一个“TOUCH_OUTSIDE”,让我的应用程序执行操作。
我未曾实现的目标:
我无论如何也想不出一种让两者都能处理数据的方法。我能想到的唯一不能实现的方法是:截取我应用程序中的数据,并将其传递到OS/homescreen/browser,以允许OS/homescreen/browser首先获取数据,然后以某种方式获得一个带有信息的回调,允许OS/homescreen/browser获取数据,对数据进行操作,并轮询它们的滚动/位置值,以便在我的应用程序中对其进行操作。
我担心这是不可能的,我想我在一些文档中读到了一些我现在找不到的东西:“要么全有要么什么都没有,要么你的视图得到所有的事件,要么一个都没有。”
(为了避免混淆,我并不是说我有两个视图。我的意思是,我有一个视图,通过覆盖OS/homescreen/browser的活动/服务控制。如果你愿意,就像一块玻璃。)
感谢您提供的任何有用的信息,非常感谢!
为了避免混淆,更新在下面发布了我自己的文档。
发布于 2014-07-12 07:09:20
这不是最优的解决方案,但它是有效的。重新启动服务,将标志切换为不可触摸。将boolean extra赋值为Intent,用于startservice以确定先前的状态切换值。一种更好的实现方式是,当窗口正在监听时,以及在未监听的固定时间段之后,在触摸时触发意图。
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);
}
}
}https://stackoverflow.com/questions/9085022
复制相似问题