首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android overlay来抓取所有的触控,并将它们传递?

Android overlay来抓取所有的触控,并将它们传递?
EN

Stack Overflow用户
提问于 2012-02-01 02:39:29
回答 4查看 25.2K关注 0票数 28

我基本上是试图从系统覆盖的东西中获取所有的触摸事件数据,基于这些触摸数据移动我的精灵,然后允许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的活动/服务控制。如果你愿意,就像一块玻璃。)

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

为了避免混淆,更新在下面发布了我自己的文档。

EN

Stack Overflow用户

发布于 2014-07-12 07:09:20

这不是最优的解决方案,但它是有效的。重新启动服务,将标志切换为不可触摸。将boolean extra赋值为Intent,用于startservice以确定先前的状态切换值。一种更好的实现方式是,当窗口正在监听时,以及在未监听的固定时间段之后,在触摸时触发意图。

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9085022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档