zoukankan      html  css  js  c++  java
  • ViewPager和View的事件响应规则

    案例背景:
      当我们实现viewpager的自动切换界面操作的时候,如果需要增加点击图片viewpager停止自动切换,松开手指viewpager自动切换又继续执行的逻辑,正常思维下实现代码如下所示:

    利用handler发送消息实现viewpager 自动滑动
            if (handler == null) {
                handler = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        // 实现切换 viewpager 界面
                        // 获取当前显示界面的索引
                        int currentItem = mViewPager.getCurrentItem();
                        // 计算下一个界面的索引
                        // 判断如果切换到最后一个界面,需要重新切换回第一个界面进行操作
                        if (currentItem == imageurls.size()-1) {
                            currentItem=0;
                        }else{
                            currentItem++;
                        }
                        // 设置 viewpager 显示下一个界面
                        mViewPager.setCurrentItem(currentItem);
                        // 一次切换完成,还需要接着执行第二次
                        handler.sendEmptyMessageDelayed(0, 3000);
                    }
                };
                handler.sendEmptyMessageDelayed(0, 3000);// 延迟 3 秒个 handler 发送消息
            }        


            // 设置 viewpager 条目界面的触摸事件,实现按下 viewpager 停止滑动,抬起 viewpager 重新滑动
            rootview.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // 停止发送 handler 延迟消息
                    handler.removeCallbacksAndMessages(null);// 参数如果是 null ,表示删除所有的延迟消息
                    break;
                case MotionEvent.ACTION_UP:
                    // 重新发送 handler 延迟消息,实现 viewpager 自动滑动
                    handler.sendEmptyMessageDelayed(0, 3000);
                    break;
                }
                // 返回 true: 执行触摸监听操作, false :不执行
                return true;
                }
            });

      即:在手指按下的时候利用handler发送停止消息而到当手指抬起的时候发送继续切换的消息 然而在实际的操作中我们发现当手指抬起的时候viewpager不能继续实现自动切换,通过对代码进行log操作发现手指抬起的时候view并没有执行up方法而是执行了cancel方法,故代码修改如下:

    // 设置 viewpager 条目界面的触摸事件,实现按下 viewpager 停止滑动,抬起 viewpager 重新滑动
        rootview.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    // 停止发送 handler 延迟消息
                    handler.removeCallbacksAndMessages(null);// 参数如果是 null ,表示删除所有的延迟消息
                    break;
                case MotionEvent.ACTION_UP:
                    // 重新发送 handler 延迟消息,实现 viewpager 自动滑动
                    handler.sendEmptyMessageDelayed(0, 3000);
                    break;
                case MotionEvent.ACTION_CANCEL:
                    // 当取消 view 的事件的时候,重新让 viewpager 自动滑动
                    handler.sendEmptyMessageDelayed(0, 3000);
                    break;
                }
                // 返回 true: 执行触摸监听操作, false :不执行
                return true;
            }
        });

    即:增加cancel方法的条目在方法内实现继续发送切换消息的逻辑。

    规则总结:
        1、如果手指缓慢滑动很短的距离,viewpager没有切换界面,所以认为viewPager和view都可以执行事件,系统不会取消任何控件的触摸事件,由我们自己决定处理哪个事件。
        2、如果手指快速滑动很长的距离,viewpager就会执行界面切换,此时view就会执行cancel方法,取消view的触摸事件,只执行viewPager的触摸事件。

  • 相关阅读:
    函数式编程(二):curry
    函数式编程(一):纯函数
    用 gulp 建一个服务器
    深度学习-Tensorflow2.2-预训练网络{7}-迁移学习基础针对小数据集-19
    深度学习-Tensorflow2.2-自定义训练综合实例与图片增强{6}-猫狗数据集实例-18
    深度学习-Tensorflow2.2-Tensorboard可视化{5}-可视化基础-17
    深度学习-Tensorflow2.2-Eager模式与自定义训练{4}-微分运算训练练习-16
    深度学习-Tensorflow2.2-卷积神经网络{3}-电影评论数据分类/猫狗数据集实例-15
    深度学习-Tensorflow2.2-批标准化简介-14
    深度学习-Tensorflow2.2-卷积神经网络{3}-卫星图像识别卷积综合实例(二分类)-13
  • 原文地址:https://www.cnblogs.com/yegong0214/p/6274736.html
Copyright © 2011-2022 走看看