Android 사용자 정의 라운드 진행 막대

6536 단어 Android진도 표
안 드 로 이 드 사용자 정의 링 식 진도 바 를 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
수 요 는 원 환 식 중간 에 진도 가 있 는 진도 조 를 실현 하고 스스로 하 나 를 실현 하 는 것 이다.

package com.djt.aienglish.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;

import com.djt.aienglish.R;


/**
 * @author qiu
 * @date 2020/3/12 13:51
 */
public class CirclePgBar extends View {
    private int mHeight = 0;
    private int mWidth = 0;

    //       
    private Paint mRingPaint;
    //          
    private Paint mRingPaintBg;
    //       
    private Paint mTextPaint;
    //     
    private int mRingColor;
    //       
    private int mRingBgColor;
    //   
    private float mRadius;
    //     
    private float mRingRadius;
    //     
    private float mStrokeWidth;
    //   x  
    private int mXCenter;
    //   y  
    private int mYCenter;
    //     
    private float mTxtWidth;
    //     
    private float mTxtHeight;
    //    
    private int max = 100;
    //     
    private int progress;
    private String text;

    public CirclePgBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        //         
        initAttrs(context, attrs);
        initVariable();
    }

    /**
     *   
     */
    private void initAttrs(Context context, AttributeSet attrs) {
        TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,
                R.styleable.TasksCompletedView, 0, 0);
        mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_circleWidth, 0);
        mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor, 0xFFFFFFFF);
        mRingBgColor = typeArray.getColor(R.styleable.TasksCompletedView_ringBgColor, 0xFFFFFFFF);
        text = typeArray.getString(R.styleable.TasksCompletedView_text);
        max = typeArray.getInteger(R.styleable.TasksCompletedView_max, 0);
        progress = typeArray.getInteger(R.styleable.TasksCompletedView_progress, 0);
    }

    /**
     *      
     */
    private void initVariable() {
        //     
        mRingPaintBg = new Paint();
        mRingPaintBg.setAntiAlias(true);
        mRingPaintBg.setColor(mRingBgColor);
        mRingPaintBg.setStyle(Paint.Style.STROKE);
        mRingPaintBg.setStrokeWidth(mStrokeWidth);
        //   
        mRingPaint = new Paint();
        mRingPaint.setAntiAlias(true);
        mRingPaint.setColor(mRingColor);
        mRingPaint.setStyle(Paint.Style.STROKE);
        mRingPaint.setStrokeWidth(mStrokeWidth);
        //mRingPaint.setStrokeCap(Paint.Cap.ROUND);//      ,     
        //   
        mTextPaint = new Paint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setColor(mRingColor);
        invalidate();
    }

    //  
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //      
        mHeight = getMeasuredHeight();
        mWidth = getMeasuredWidth();
        if (mWidth > mHeight) {
            mRadius = mHeight / 2;
        } else {
            mRadius = mWidth / 2;
        }
        //  
        mRingRadius = mRadius - mStrokeWidth / 2;
        //      
        mTextPaint.setTextSize(mRadius / 2);
        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
    }

    /**
     *   
     */
    @Override
    protected void onDraw(Canvas canvas) {
        mXCenter = mWidth / 2;
        mYCenter = mHeight / 2;
        //     
        RectF rectBg = new RectF(mXCenter - mRingRadius, mYCenter - mRingRadius, mXCenter + mRingRadius, mYCenter + mRingRadius);
        canvas.drawArc(rectBg, 0, 360, false, mRingPaintBg);
        //   //  
        if (progress > 0) {
            RectF oval = new RectF(mXCenter - mRingRadius, mYCenter - mRingRadius, mXCenter + mRingRadius, mYCenter + mRingRadius);
            canvas.drawArc(oval, -90, ((float) progress / max) * 360, false, mRingPaint);
        }
        //  
        if(!TextUtils.isEmpty(text)) {
            mTxtWidth = mTextPaint.measureText(text, 0, text.length());
            canvas.drawText(text, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);
        }
    }

    /**
     *     
     *
     * @param progress
     */
    public void setProgress(int progress) {
        this.progress = progress;
        postInvalidate();//  
    }

    /**
     *      
     *
     * @param max
     */
    public void setMax(int max) {
        this.max = max;
        postInvalidate();
    }

    /**
     *       
     *
     * @param text
     */
    public void setText(String text) {
        this.text = text;
        postInvalidate();
    }
}
value 의 attr.xml 에 기본 설정 속성 을 추가 하 는 것 을 잊 지 마 세 요.

<!--     -->
    <declare-styleable name="TasksCompletedView">
        <attr name="circleWidth" format="dimension" />
        <attr name="ringColor" format="color" />
        <attr name="ringBgColor" format="color" />
        <attr name="text" format="string" />
        <attr name="progress" format="integer" />
     <attr name="max" format="integer" />
</declare-styleable>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기