zoukankan      html  css  js  c++  java
  • 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模拟事件,自动触发

  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/9548559.html
Copyright © 2011-2022 走看看