自定义Android扇形的加载ProgressBar

扇形的加载ProgressBar

之前在其他大神的文章中用看过自定义的空间,现在有时间自己可以尝试一下了,这是自定义的圆形的加载view

在valus中创建,自定义yuan_attrs.xml


<resources>
    <declare-styleable name="YuanView">
    <attr name="yuan_color" format="color" />
    <attr name="text_color" format="color" />
    <attr name="view_witch" format="dimension" />
    <attr name="view_height" format="dimension" />
    <attr name="text" format="string"/>
        <attr name="text_size" format="dimension"/>
    declare-styleable>
resources>

下面的是自定义控件

public class YuanProgressbar extends AppCompatTextView {

    private Paint paint_text;
    private Paint paint_yuan;
    private Paint paint_arc;
    private RectF rectfArc;
    private int text_color;//文字的颜色
    private int yuan_color;//背景的颜色
    private String text;//文字
    private int mTitleTextSize;
    private Rect mBound;
    float ratio = 0.00f;//比例初始值
    /**
     * 当前进度
     */
    private int progress;
    /**
     * 最大进度
     */
    float maxValue;
    /**
     * 当前进度
     */
    float currentValue;

    private Context context;


    public YuanProgressbar(Context context) {
        this(context, null);
        this.context = context;
    }

    public YuanProgressbar(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public YuanProgressbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        init(context, attrs, defStyleAttr);
    }


    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.YuanView, defStyleAttr, 0);
        text_color = ta.getColor(R.styleable.YuanView_text_color, Color.RED);
        yuan_color = ta.getColor(R.styleable.YuanView_yuan_color, Color.BLACK);
        text = ta.getString(R.styleable.YuanView_text);
        for (int n = 0; n < ta.getIndexCount(); n++) {
            int attr = ta.getIndex(n);
            if (attr == R.styleable.YuanView_text_size) {
                mTitleTextSize = ta.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
            }

        }

        ta.recycle();


        //初始化画笔
        paint_yuan = new Paint();
        paint_yuan.setColor(yuan_color);
        paint_yuan.setStyle(Paint.Style.FILL);//设为实心

        paint_text = new Paint();
        paint_text.setColor(text_color);
        paint_text.setTextSize(mTitleTextSize);
        paint_text.setStyle(Paint.Style.FILL);

        paint_arc = new Paint();
        paint_arc.setColor(Color.RED);
        paint_arc.setStrokeWidth(2);
        paint_arc.setStyle(Paint.Style.STROKE);//设为空心

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        printYuan(canvas);//画圆准备1/4扇形
        printArc(canvas);//圆弧
        printText(canvas);//写字

    }

    private void printArc(Canvas canvas) {
        int center = getWidth() / 2;
        int ringWidth = dip2px(context, 5); //设置圆环宽度
        int radius = (center - ringWidth / 2); //圆环的半径
        this.paint_arc.setStrokeWidth(ringWidth);
        paint_arc.setAntiAlias(true);  //消除锯齿
        canvas.drawCircle(center, center, radius, this.paint_arc);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private void printText(Canvas canvas) {
        canvas.save();
        paint_text.getTextBounds(text, 0, text.length(), mBound);
        canvas.drawText(text, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, paint_text);
        canvas.restore();
    }

    private void printYuan(Canvas canvas) {
        RectF rectF = new RectF(getLeft(), getTop(), getRight(), getBottom());
//        canvas.drawCircle(getWidth()/2, getHeight()/2, getWidth()/2, paint_yuan);//中心圆点
        canvas.drawArc(rectF, 180, ratio * 360, true, paint_yuan);//设置为180是为了从左边开始画图
    }

    public void setText(String text) {
        this.text = text;
        invalidate();
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    public float getMaxValue() {
        return maxValue;
    }

    public float getCurrentValue() {
        return currentValue;
    }

    public synchronized void setMaxValue(float maxValue) {
        if (maxValue < 0) {
            throw new IllegalArgumentException("max not less than 0");
        }
        this.maxValue = maxValue;
    }

    /**
     * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步
     * 刷新界面调用postInvalidate()能在非UI线程刷新
     *
     * @param currentValue
     */
    public synchronized void setProgress(float currentValue) {
        if (currentValue < 0) {
            throw new IllegalArgumentException("progress not less than 0");
        }
        if (currentValue > maxValue) {
            currentValue = maxValue;
        }
        if (currentValue <= maxValue) {
            this.currentValue = currentValue;
            DecimalFormat df = new DecimalFormat("#0.00");
            ratio = Float.valueOf(df.format(currentValue / maxValue));
            postInvalidate();
        }

    }

    /**
     * 获取进度.需要同步
     *
     * @return
     */
    public synchronized float getProgress() {
        return currentValue;
    }

}

以下是在activity.xml中搭建布局,因为有自定义的属性需要在xml中添加
xmlns:yuan=”http://schemas.android.com/apk/res-auto”


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:yuan="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.demo.view.Main3Activity">

<com.example.demo.view.YuanProgressbar
        android:id="@+id/yuan"
        yuan:text="圆"
        yuan:text_size="16sp"
        yuan:text_color="#ff00ff"
        yuan:yuan_color="#00ff00"
        android:layout_width="200dp"
        android:layout_height="200dp" />

 LinearLayout>

接下来是在MainActivity中实现了

public class MainActivity extends AppCompatActivity {

    private YuanProgressbar yuanView;


   /* public static void launch(Context ctx) {
        Intent it = new Intent(ctx, PanOneActivity.class);
        ctx.startActivity(it);
    }*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        initViews();
    }

    private void initViews() {

        yuanView = (YuanProgressbar) findViewById(R.id.yuan);
        yuanView.setText("0000");
        yuanView.setMaxValue(300);
        yuanView.setProgress(100);
       }
}

你可能感兴趣的:(自定义Android扇形的加载ProgressBar)