android限制SeekBar在某个范围内滑动(限制滑动区域)

项目开发中突然遇到这样一个需求:滑动条在进度0-3时不可滑动,其他区域正常滑动。显示要去重新自定义一个SeekBar需要花费时间项目上不允许,但可以从原生SeekBar着手限制。
要限制SeekBar的触摸范围,实际上为限制SeekBar的触摸事件,代码如下:

mSeekBar.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int width = mSeekBar.getWidth();
                if (mTouchLimit > 0) {
                    if (isRtl()) {
                        float limitWidth = (width - width / mMax * mTouchLimit);
                        if (event.getX() > limitWidth) {
                            if (event.getAction() == MotionEvent.ACTION_UP) {
                                final long downTime = SystemClock.uptimeMillis();
                                MotionEvent motionEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, limitWidth, event.getY(), 0);
                                mSeekBar.onTouchEvent(motionEvent);
                            }
                            return true;
                        }
                    } else {
                        float limitWidth = width / mMax * mTouchLimit;
                        if (event.getX() < limitWidth) {
                            if (event.getAction() == MotionEvent.ACTION_UP) {
                                final long downTime = SystemClock.uptimeMillis();
                                MotionEvent motionEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, limitWidth, event.getY(), 0);
                                mSeekBar.onTouchEvent(motionEvent);
                            }
                            return true;
                        }
                    }
                }
                return false;
            }
        });

其中mTouchLimit为int类型参数,代表限制滑动范围的值,例如当mTouchLimit为3时,增SeekBar只能触摸到0-3区域不可触摸。mMax为SeekBar的最大值。代码中isRtl()的判断为处理阿拉伯语言时滑动条方向左右翻转,因此触摸坐标限制需要重新换算。

 private boolean isRtl() {
        return TextUtilsCompat.getLayoutDirectionFromLocale(getResources().getConfiguration().locale) == ViewCompat.LAYOUT_DIRECTION_RTL;
    }

再触摸事件释放时调用mSeekBar.onTouchEvent(motionEvent)模拟发送触摸事件是为了解决滑块Thumb没有恢复的问题。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值