SeekBar可拖动不可点击,滑块禁止点击快进
先附上github链接:https://github.com/feiyuu/NoClickSeekBar
no bb 直接上代码
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!mIsUserSeekable || !isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (isInScrollingContainer()) {
mTouchDownX = event.getX();
} else {
startDrag(event);
}
break;
case MotionEvent.ACTION_MOVE:
if (mIsDragging) {
trackTouchEvent(event);
} else {
final float x = event.getX();
if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) {
startDrag(event);
}
}
break;
case MotionEvent.ACTION_UP:
if (mIsDragging) {
trackTouchEvent(event);
onStopTrackingTouch();
setPressed(false);
} else {
// Touch up when we never crossed the touch slop threshold should
// be interpreted as a tap-seek to that location.
onStartTrackingTouch();
trackTouchEvent(event);
onStopTrackingTouch();
}
// ProgressBar doesn't know to repaint the thumb drawable
// in its inactive state when the touch stops (because the
// value has not apparently changed)
invalidate();
break;
case MotionEvent.ACTION_CANCEL:
if (mIsDragging) {
onStopTrackingTouch();
setPressed(false);
}
invalidate(); // see above explanation
break;
}
return true;
}
这是seekbar父类里面处理滑动和点击事件的代码。自定义seekbar重写onTouchEvent不调用super就执行不到这里,也就没有拖动和点击事件了。
判断是DOWN事件是否在thumb滑块上,如果不在就不处理事件,就能实现禁止点击快进进度条了。
判断是否在thumb上的代码
(这里需要加上ThumbOffset和padding的距离,高度不用管因为thumb占满高度,设置个背景就能看出来):
/**
* 判断MotionEvent事件是否位于thumb上
*
* @param event
* @param thumbBounds
* @return
*/
private boolean isTouchInThumb(MotionEvent event, Rect thumbBounds) {
float x = event.getX();
float y = event.getY();
//根据偏移量和左边距确定thumb位置
int left = thumbBounds.left - getThumbOffset() + getPaddingLeft();
int right = left + thumbBounds.width();
if (x >= left && x <= right
&& y >= thumbBounds.top && y <= thumbBounds.bottom)
return true;
return false;
}
自定义seekBar的onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!isTouchInThumb(event, getThumb().getBounds())) {
return false;
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return super.onTouchEvent(event);
}
嫌滑块区域太小,操作拖动不流畅?看如何增大触摸区域吧:
seekbar用shape图像设置thumb滑块图片,要想扩大点击区域同时不改变滑块大小。如果通过设置maxheight或者padding在一些手机上确实能达到效果,但是在部分手机上会出现意想不到的UI效果(亲测!!!),so最好是(亲测兼容,稳定,好使!)。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorPrimary"></solid>
<size
android:width="60dp"
android:height="60dp"
></size>
<stroke android:width="50dp"
android:color="@android:color/transparent"
></stroke>
</shape>
给滑块设置等待动画
//seekbar滑块动画
mRotateDrawable = (RotateDrawable) getResources().getDrawable(R.drawable.audio_loading_progress);
mValueAnimator = ValueAnimator.ofInt(0, 10000);
mValueAnimator.setDuration(6000);
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer level = (Integer) animation.getAnimatedValue();
level = level + 200;
mRotateDrawable.setLevel(level);
}
});
mValueAnimator.setRepeatMode(ValueAnimator.RESTART);
mValueAnimator.setRepeatCount(ValueAnimator.INFINITE);
mValueAnimator.setInterpolator(new LinearInterpolator());
mSeekBar.setThumb(mRotateDrawable);
mValueAnimator.start();
drawable:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/seekbar_thumb_wait"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="-1">
</rotate>