• SeekBar滑动时,progress数值不连续


    问题描述

    logcat

    你是否也遇见过这样的情况,SeekBar的进度不连续

    这是我在做一个编辑图片的APP时,观察我打印的log,发现progress不是连续的
    这时候可能就有人问:是你代码写的不对吧,老哥

    贴出代码

    public class MySeekBar extends AppCompatSeekBar {
        String TAG = "MySeekBar";
        private Context mContext;
        public MySeekBar(Context context) {
            super(context);
            mContext = context;
            init();
        }
        public MySeekBar(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mContext = context;
            init();
        }
        public MySeekBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
            init();
        }
        private void init() {
            setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    Log.i(TAG, "onProgressChanged: " + seekBar.getProgress());
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });
        }
    }
    

    主要代码都在init()这个函数里面,其他的就是一些构造函数,传参

    分析问题

    那么为什么会发生这种事情呢??是不是断触了???还是手机屏幕判断不准了

    直接说结论(这是我向一个大神请教的)

    结论就是:Android SeekBar底层机制是16ms报告一次,也就是返回一次数据,也就是一秒62.5次,采样率就是62.5Hz
    也就是说Android SeekBar的滑动虽然看起来是你设置的setMax()的数值,但是底层并不是实时监控的,其实,大多数,也可以说是全部的计算机系统(因为我还没有想出来反例)工作原理都是采样,而并非实时监控。只是Android的这个SeekBar采样率有点低,所以在我们快速滑动的时候, 就会出现这种progress(进度)不连续的现象。
    而且,手机屏也是有采样率的,这个关注手机数码圈的肯定都知道,如果你手机采样率跟不上你单身20年的手速,就会出现操作不连贯的现象,例如王者荣耀、吃鸡、或者快速在屏幕上写字的时候,就会出现断触的现象,导致游戏失败,或字体奇怪(以后再有人说我菜,我就说是手机的问题,说我字丑也是手机的问题)

    尝试解决问题

    放弃 SeekBar 点击

    方法一:强制慢划

    你可以在 onProgressChanged 这个回调函数里面写一些逻辑,判断下一次 change 的 progress 是否连续,例如这样:

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
                    if(progress > oldProgress + 1 || progress < oldProgress - 1){
                        seekBar.setProgress(oldProgress);
                        return;
                    }
                    seekBar.setProgress(progress);
                    oldProgress = progress;
                }
    

    可以看到已经非常连贯了
    但是这又会导致另外一个问题,那就是必须慢慢拖动才行,不跟手,稍微快一点就拉跨

    其方法在持续探索中,敬请期待

  • 相关阅读:
    Java 理论与实践: 正确使用 Volatile 变量
    Zookeeper 原理
    Java中GC的工作原理
    Redis 5种数据结构使用及注意事项
    Redis 支持的5种数据结构
    浅谈JavaScript词法分析步骤
    四句话总结JavaScript作用域
    Web模板引擎本质前奏
    python【第十三篇】可以写一个堡垒机了
    python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
  • 原文地址:https://www.cnblogs.com/hairless/p/13387260.html
Copyright © 2020-2023  润新知