美文网首页
自定义View之路(二)

自定义View之路(二)

作者: 宁静世界 | 来源:发表于2018-06-16 18:16 被阅读0次

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

下面是自定义一个进度条
image.png

用的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;
    }
}

相关文章

网友评论

      本文标题:自定义View之路(二)

      本文链接:https://www.haomeiwen.com/subject/wypbeftx.html