andriod开发自定义View实现系统亮度调节控件
1. 效果图如下所示:
方向是垂直方向上下可以滑动的 ,当然你也可以调整为水平方向左右滑动
2. 直接上代码,如下:
public class BrightnessBar extends View {
private float mProgress = 80;
private float mCornerRadius = 20;
private final RectF mBackgroudRect = new RectF();
private final Paint mBackgroundPaint = new Paint();
private final RectF mProgressRect = new RectF();
private final Paint mProgressPaint = new Paint();
public BrightnessBar(Context context) {
this(context, null);
}
public BrightnessBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mBackgroundPaint.setColor(Color.parseColor("#252D2D"));
mBackgroundPaint.setStyle(Paint.Style.FILL);
mProgressPaint.setColor(Color.GRAY);
mProgressPaint.setStyle(Paint.Style.FILL);
mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBackgroudRect.set(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom());
updateProgressRect();
}
private void updateProgressRect() {
float total = mBackgroudRect.bottom - mBackgroudRect.top;
mProgressRect.set(mBackgroudRect.left, mBackgroudRect.top + total * (100 - mProgress) / 100, mBackgroudRect.right, mBackgroudRect.bottom);
mCornerRadius = (mBackgroudRect.right - mBackgroudRect.left) / 2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
path.reset();
path.addRoundRect(mBackgroudRect, mCornerRadius, mCornerRadius, Path.Direction.CCW);
canvas.clipPath(path);
canvas.drawRect(mBackgroudRect, mBackgroundPaint);
path.reset();
path.addRoundRect(mProgressRect, mCornerRadius, mCornerRadius, Path.Direction.CCW);
canvas.clipPath(path);
canvas.drawRect(mProgressRect, mProgressPaint);
}
// 设置进度
public void setProgress(float progress) {
setProgressInternal(progress, false);
}
private void setProgressInternal(float progress, boolean fromUser) {
if (progress < 0) progress = 0;
if (progress > 100) progress = 100;
this.mProgress = progress;
updateProgressRect();
invalidate(); // 重新绘制
if (mOnProgressChangeListener != null) {
mOnProgressChangeListener.onProgressChanged(this, (int) progress, fromUser);
}
}
public float getProgress() {
return mProgress;
}
private final Path path = new Path();
boolean mIsUserSeekable = true;
private float mTouchDownX;
private boolean mIsDragging;
private int mScaledTouchSlop;
public boolean inScrollingContainer() {
ViewParent p = getParent();
while (p != null && p instanceof ViewGroup) {
if (((ViewGroup) p).shouldDelayChildPressedState()) {
return true;
}
p = p.getParent();
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!mIsUserSeekable || !isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (inScrollingContainer()) {
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 {
onStartTrackingTouch();
trackTouchEvent(event);
onStopTrackingTouch();
}
invalidate();
break;
case MotionEvent.ACTION_CANCEL:
if (mIsDragging) {
onStopTrackingTouch();
setPressed(false);
}
invalidate();
break;
}
return true;
}
private void startDrag(MotionEvent event) {
setPressed(true);
onStartTrackingTouch();
trackTouchEvent(event);
attemptClaimDrag();
}
void onStartTrackingTouch() {
mIsDragging = true;
if (mOnProgressChangeListener != null) {
mOnProgressChangeListener.onStartTrackingTouch(this);
}
}
void onStopTrackingTouch() {
mIsDragging = false;
if (mOnProgressChangeListener != null) {
mOnProgressChangeListener.onStopTrackingTouch(this);
}
}
private void attemptClaimDrag() {
ViewParent mParent = getParent();
if (mParent != null) {
mParent.requestDisallowInterceptTouchEvent(true);
}
}
private void trackTouchEvent(MotionEvent event) {
final int y = Math.round(event.getY());
final int height = getHeight();
final int availableHeight = height - getPaddingTop() - getPaddingBottom();
final float scale;
float progress = 0.0f;
if (y < getPaddingTop()) {
scale = 0.0f;
} else if (y > height - getPaddingTop()) {
scale = 1.0f;
} else {
scale = (y - getPaddingTop()) / (float) availableHeight;
progress = 0.0f;
}
final int range = 100;//进度条的范围100-0
progress += scale * range;
setProgressInternal(range - progress, true);
}
private OnProgressChangeListener mOnProgressChangeListener;
public void setOnProgressChangeListener(OnProgressChangeListener listener) {
mOnProgressChangeListener = listener;
}
public interface OnProgressChangeListener {
void onProgressChanged(BrightnessBar brightnessBar, int progress, boolean fromUser);
void onStartTrackingTouch(BrightnessBar brightnessBar);
void onStopTrackingTouch(BrightnessBar brightnessBar);
}
}