自定义滑条

我们有很多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;
	}

}
希望能够帮助大家



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值