Android-一只手指滑动View,另一只手指按Home键,重新进入后View状态无法更新的问题

上午测试报了一个bug:说是一只手指拖动虚拟摇杆上的View滑块不松,另一只手指点击Home键将App压后台,重新进入的时候,View滑块卡死了。

刚开始看到这个问题感觉很奇怪,因为正常情况下,手指离开屏幕,收到ACTION_UP事件后,滑块肯定是会返回中心点的。但是这种情况很明显就是没有收到ACTION_UP事件。后来在代码中打印了下Log,证实了我的想法。

那既然收不到ACTION_UP事件,我自己模拟一个ACTION_UP事件发给这个摇杆View就好了。

解决办法:

1.监听用户点击Home键的动作

android上监听Home键与Back键还不一样,不能在onKeyDown方法中去处理,必须要注册一个广播才能监听到Home键:

复制代码
private void registerHomeReceiver(){
        IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        registerReceiver(homePressReceiver, homeFilter);
    }
    //HOME键监听
    private BroadcastReceiver homePressReceiver = new BroadcastReceiver() {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            String action = intent.getAction();
            if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                System.out.println("reason : " + reason);
                if(reason!=null&&reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)){
                    System.out.println("按HOME键使应用进入了后台");
                }
            }
        }
    };
复制代码

需要注意的是,在Android8.0上最好使用动态广播的方式来注册,使用静态广播有时候会收不到消息。

另外,该广播除了能监听点击Home键外,还可以监听长按home键,以及按锁屏事件等,甚至是Activity切换的按键

2.当用户点击Home键后,手动模拟一个ACTION_UP事件发送给指定的View

复制代码
private void sendTouchUpEvent2RockerView() {
        long downTime = SystemClock.uptimeMillis();
        long eventTime = SystemClock.uptimeMillis() + 100;
        float x = 0.0f;
        float y = 0.0f;
        int metaState = 0;
        MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, metaState);
        mLeftControllerView.dispatchTouchEvent(event);
        mRightControllerView.dispatchTouchEvent(event);
    }
复制代码

然后在广播接收者中去处理:

case Intent.ACTION_CLOSE_SYSTEM_DIALOGS:
     String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
     if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
         sendTouchUpEvent2RockerView();
     }
     break;

完了之后试了一下,果然没有了先前的问题。

参考链接:

Android监听Home键

Android Home键监听

android MotionEvent.obtain模拟事件,自动触发

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(659)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示