当你看完了第一篇之后你会发现你再来自定义这种View是不是易如反掌了呢
下面是自定义一个进度条

用的API和第一篇几乎是一样的,只是逻辑计算比之前要稍微复杂一些
包含进度动画,已完成进度百分比
需要掌握的
//这一段代码是用来计算文本的宽高等参数
String mText = mAnimProgress + "%";
Rect bounds = new Rect();
mForegroundPaint.getTextBounds(mText, 0, mText.length(), bounds);
//invalidate这个方法极为重要,调用这个方法能够引起View的重绘
invalidate();
public class DiyView03 extends View {
private Paint mBackgroundPaint;
private Paint mForegroundPaint;
private Paint mProgressPaint;
private int mRound = 20;
private int mWidth;
private int mHight;
private int mProgressHight;
private int mProgress = 40;
private int mCompleteProgress;
private int mAnimProgress = 1;
private boolean mNeedAnimProgress = true;
private boolean mNeedTextProgress = true;
public DiyView03(Context context) {
this(context, null);
}
public DiyView03(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DiyView03(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mBackgroundPaint = new Paint();
mBackgroundPaint.setColor(Color.GRAY);
mForegroundPaint = new Paint();
mForegroundPaint.setColor(getContext().getResources().getColor(R.color.colorGreen));
mProgressPaint = new Paint();
mProgressPaint.setTextSize(getResources().getDimension(R.dimen.texts)); //以px为单位
mProgressPaint.setColor(getContext().getResources().getColor(R.color.colorAccent));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = measureWidth(widthMeasureSpec);
mHight = measureHeight(heightMeasureSpec);
mProgressHight = (int) (mHight * 0.5);
mRound = mProgressHight / 3;
setMeasuredDimension(mWidth, mHight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRoundRect(new RectF(0, mProgressHight, mWidth, mHight), mRound, mRound, mBackgroundPaint);
if (mProgress > 0) {
mNeedAnimProgress = mAnimProgress == mProgress ? false : true;
if (mNeedAnimProgress) {
mCompleteProgress = mWidth * mAnimProgress / 100;
mHandler.sendEmptyMessageDelayed(1, 40);
} else {
mCompleteProgress = mWidth * mProgress / 100;
mAnimProgress = mProgress;
}
String mText = mAnimProgress + "%";
Rect bounds = new Rect();
mForegroundPaint.getTextBounds(mText, 0, mText.length(), bounds);
mProgressPaint.setTextSize((float) ((mHight - mProgressHight) * 0.8));
if (mNeedTextProgress) {
canvas.drawText(mText, mCompleteProgress - bounds.right, mProgressHight + bounds.top, mProgressPaint);
}
canvas.drawRoundRect(new RectF(0, mProgressHight, mCompleteProgress, mHight), mRound, mRound, mForegroundPaint);
}
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mAnimProgress++;
invalidate();
}
};
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 0;
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
// result = specSize;
result = 600;
if (specMode == MeasureSpec.AT_MOST) {
result = result < specSize ? result : specSize;
}
}
return result;
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 0;
if (specMode == MeasureSpec.EXACTLY) {
return specSize;
} else {
// result = specSize;
result = 20;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}
public Paint getmBackgroundPaint() {
return mBackgroundPaint;
}
public void setmBackgroundPaint(Paint mBackgroundPaint) {
this.mBackgroundPaint = mBackgroundPaint;
}
public Paint getmForegroundPaint() {
return mForegroundPaint;
}
public void setmForegroundPaint(Paint mForegroundPaint) {
this.mForegroundPaint = mForegroundPaint;
}
public Paint getmProgressPaint() {
return mProgressPaint;
}
public void setmProgressPaint(Paint mProgressPaint) {
this.mProgressPaint = mProgressPaint;
}
public int getmProgress() {
return mProgress;
}
public void setmProgress(int mProgress) {
this.mProgress = mProgress;
}
public boolean ismNeedAnimProgress() {
return mNeedAnimProgress;
}
public void setmNeedAnimProgress(boolean mNeedAnimProgress) {
this.mNeedAnimProgress = mNeedAnimProgress;
}
public boolean ismNeedTextProgress() {
return mNeedTextProgress;
}
public void setmNeedTextProgress(boolean mNeedTextProgress) {
this.mNeedTextProgress = mNeedTextProgress;
}
}
网友评论