我们有很多app中都用到了滑条,listView,和scrollView中都内置了滑条,当有些应用我们没用到listView 和scrollView,但是我们又要用到滑条功能,那只能自定义一个滑条来实现我们想要的功能,代码如下:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class PianoProgressView extends View {
private Drawable mSubBgDrawable, mThumbDrawable;
private Rect mSubBgRect, mThumbRect;
private int mSubRepeatNum = 0;
private float mThumbPercent = 0.5F;
private float progress;
private float lastX;
private int left;
private int maxX;
private boolean isTouchOnThumb;
private OnProgressChangedListener listener;
public PianoProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mSubBgDrawable = getResources().getDrawable(R.drawable.slide_key_bg);
mThumbDrawable = getResources().getDrawable(R.drawable.slider);
mSubBgRect = new Rect();
mThumbRect = new Rect();
}
@Override
protected void onDraw(Canvas canvas) {
mSubBgRect.offsetTo(0, 0);
for (int i = 0; i < mSubRepeatNum; i++) {
mSubBgDrawable.setBounds(mSubBgRect);
mSubBgDrawable.draw(canvas);
mSubBgRect.offset(mSubBgRect.width(), 0);
}
mThumbRect.offsetTo(left, 0);
mThumbDrawable.setBounds(mThumbRect);
mThumbDrawable.draw(canvas);
}
//设置滑块显示的位置(progress 最大值为1,最小值为0)
public void setProgress(float progress) {
if (progress < 0) {
progress = 0;
}
if (progress > 1) {
progress = 1;
}
if (this.progress != progress) {
this.progress = progress;
}
if (getWidth() > 0) {
left = (int) (maxX * progress);
invalidate();
}
if (listener != null) {
listener.onProgressChanged(this, progress, false);
}
}
//可以通过点击按钮让滑块移动(向左移动为 -,向左移动为 +,offset最大值为1,最小值为-1)
public void offsetProgress(float offset) {
this.progress += offset;
setProgress(progress);
}
//设置滑块大小(thumbPercent 最大值为1,最小值为0)
public void setThumbPercent(float thumbPercent) {
mThumbPercent = thumbPercent;
if (getWidth() > 0) {
mThumbRect.set(0, 0, (int) (mThumbPercent * getWidth()),
getHeight());
maxX = (getWidth() - mThumbRect.width());
left = (int) (maxX * progress);
invalidate();
}
}
//滑块改变
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int subW = (int) (h * mSubBgDrawable.getIntrinsicWidth() * 1.0F / mSubBgDrawable
.getIntrinsicHeight());
mSubBgRect.set(0, 0, subW, h);
if (w % subW != 0) {
mSubRepeatNum = w / subW + 1;
} else {
mSubRepeatNum = w / subW;
}
mThumbRect.set(0, 0, (int) (mThumbPercent * w), h);
maxX = (getWidth() - mThumbRect.width());
left = (int) (maxX * progress);
}
//滑块移动
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouchOnThumb = mThumbRect.contains((int) event.getX(),
(int) event.getY());
if (!isTouchOnThumb) {
int l = (int) (event.getX() - mThumbRect.width() / 2);
onLeftChanged(l);
} else {
lastX = event.getX();
}
break;
case MotionEvent.ACTION_MOVE:
if (isTouchOnThumb) {
int l = left + (int) (event.getX() - lastX);
lastX = event.getX();
onLeftChanged(l);
}
break;
default:
break;
}
return true;
}
private void onLeftChanged(int l) {
l = Math.min(l, maxX);
l = Math.max(0, l);
if (l != left) {
left = l;
progress = left * 1.0F / maxX;
invalidate();
if (listener != null) {
listener.onProgressChanged(this, progress, true);
}
}
}
public void setOnProgressChangedListener(OnProgressChangedListener listener) {
this.listener = listener;
}
//滑块滑动监听接口
public interface OnProgressChangedListener {
void onProgressChanged(PianoProgressView view, float progress, boolean fromUser);
}
public float getThumbPercent() {
return mThumbPercent;
}
}
希望能够帮助大家