Seekbar偶发onStopTrackingTouch没有回调是怎么回事?

今天处理问题时遇到了Seekbar拖动时偶发onStopTrackingTouch没有回调的问题,百度上找了一下都是说是在setOnSeekBarChangeListener中执行了耗时操作,但我实际上是没有执行耗时操作的,折腾了半天也没解决,最后通过GPT找到了灵感。以下是GPT的回答:

问:Seekbar偶发onStopTrackingTouch没有回调是怎么回事?

答:如果您在使用 Seekbar 时遇到了 onStopTrackingTouch 方法没有回调的问题,可能有几个原因导致该行为:

1. Android 版本的问题:某些 Android 版本可能存在 Seekbar 的回调问题。您可以尝试在不同的 Android 版本上测试,看是否存在兼容性问题。

2. Seekbar 的设置问题:请确保您正确设置了 Seekbar 的监听器,确保正确地调用了 setOnSeekBarChangeListener 方法,并正确实现了 onStopTrackingTouch 方法。另外,请确保没有在代码中禁用了 onStopTrackingTouch 的回调。

3. 用户交互问题: onStopTrackingTouch 方法仅在用户结束滑动操作时触发,因此请确保您在滑动 Seekbar 之后松开手指,而不是在松开手指之前取消滑动。

如果您仍然无法解决问题,建议您检查相关日志、调试信息或提供更多的代码和上下文信息,以便更准确地处理问题。

问:第3点松开手指之前取消滑动是怎么操作的?

答:在SeekBar上松开手指之前取消滑动可能是指在按下SeekBar滑块后,但在松开手指之前将手指从屏幕上移开,而不是将手指保留在滑块上并继续滑动。

这种情况可能发生在以下情况下:

1. 用户不小心将手指从屏幕上移开,例如由于触摸误差或未意识到需要保持按下状态。

2. 用户改变主意,并决定在松开手指之前取消滑动操作,即不更改SeekBar的进度。

在这种情况下,SeekBar会接收到取消操作的事件,因此不会触发onStopTrackingTouch回调。这是正常行为,因为onStopTrackingTouch仅在手指滑动完毕并松开手指后触发。

如果您希望捕获这种取消操作,可以考虑使用onTouchEvent方法,并检查ACTION_CANCEL事件是否发生。您可以在该方法中执行相应的操作来处理此类情况。

问:还有其他原因会导致onStopTrackingTouch没有回调吗?

答:除了前面提到的可能原因外,还有一些其他情况可能导致 onStopTrackingTouch 没有回调的问题:

4. 滑动区域的大小和位置:如果 Seekbar 的滑动区域大小或位置存在问题,可能导致用户无法正确地结束滑动操作,从而不会触发 onStopTrackingTouch 回调。您可以检查 Seekbar 的布局参数和位置,确保其可以在正确的位置捕获用户的触摸事件。

5. 定制化问题:如果您对 Seekbar 进行了定制化修改或使用了第三方库来实现 Seekbar,那么可能存在定制化的问题。请确认您的定制化逻辑或库是否正确地处理了 onStopTrackingTouch 方法的回调。

6. 其他事件或操作干扰:如果在 Seekbar 滑动期间有其他事件或操作干扰了触摸事件的传递,可能会导致 onStopTrackingTouch 无法触发。这可能涉及到您的布局结构或其他与 Seekbar 相关的交互元素。请检查是否存在其他可能导致干扰的因素,例如嵌套布局、触摸冲突等。

如果以上解决方法无法解决您的问题,建议您提供更多的代码和上下文信息,以便更准确地诊断和解决问题。

GPT的回答中第4和第6点提到滑动区域和其他事件干扰,于是我查看了相关代码,好家伙,代码中果然有扩大滑动区域并且重新进行了事件分发,代码如下:

        SeekBar seekBar = viewMediaBinding.viewMediaPlay.musicSeekBar;
        View view = (View) viewMediaBinding.viewMediaPlay.musicSeekBar.getParent();
        final int SEEK_SCOPE = 10;
        view.setOnTouchListener((v, event) -> {
            Rect seekBarRect = new Rect();
            // 获取相对于父view的位置
            seekBar.getHitRect(seekBarRect);
            // 上下扩大了指定的接收范围
            if (event.getY() >= seekBarRect.top - SEEK_SCOPE
                    && event.getY() <= seekBarRect.bottom + SEEK_SCOPE
                    && event.getX() >= seekBarRect.left
                    && event.getX() <= seekBarRect.right) {
                MotionEvent obtain = MotionEvent.obtain(event.getDownTime(),
                        event.getEventTime(), event.getAction(),
                        event.getX() - seekBarRect.left,
                        seekBarRect.top + seekBarRect.height() / 2.0F,
                        event.getMetaState());
                return seekBar.onTouchEvent(obtain);
            } else {
                seekBarTracking = false;
                viewMediaBinding.viewMediaPlay.seekBarIndicator.setVisibility(View.GONE);
            }
            return false;
        });

把代码一删,这下彻底正常了,就是滑动区域变小了,没关系,滑动区域而已嘛,直接在控件里加一句android:paddingTop="10dp",解决,搞不懂之前的人为啥要写这么麻烦的代码!

                                                                                                                        前人挖坑后人填

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值