自定义圆形进度条

来源:互联网 发布:把json转化成数组 编辑:程序博客网 时间:2024/06/18 09:08

自定义相机扫描二维码的权限

    compile 'com.google.zxing:core:3.2.1'    compile 'cn.bingoogolapple:bga-qrcodecore:1.1.3@aar'    compile 'cn.bingoogolapple:bga-zxing:1.1.3@aar'

Main方法里的代码

package com.example.weekonetext;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private Button btn_start;    private static final int FLAG = 123;    private CircleDemo ccd;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    Handler handler = new Handler()    {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if(msg.what==FLAG)            {                int progress = ccd.getProgress();                if(progress>=100)                {                    progress=0;                }                progress+=10;                ccd.setProgress(progress);                handler.sendEmptyMessageDelayed(FLAG,1000);            }        }    };    private void initView() {        btn_start = (Button) findViewById(R.id.btn_start);        ccd = (CircleDemo) findViewById(R.id.ccd);        btn_start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                handler.sendEmptyMessageDelayed(FLAG,1000);            }        });        ccd.setOnCircleDemoListen(new CircleDemo.OnCircleDemoListen() {            @Override            public void onProgressUpdated(int progress) {                if(progress>=100)                {                    Intent intent = new Intent(MainActivity.this,Main2Activity.class);                    startActivity(intent);                }            }        });    }    @Override    protected void onStop() {        super.onStop();        handler.removeMessages(FLAG);    }}

自定义View方法里的代码

package com.example.weekonetext;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Typeface;import android.icu.util.Measure;import android.os.Build;import android.support.annotation.Nullable;import android.support.annotation.RequiresApi;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.View;/** * Created by Administrator on 2017/11/4 0004. */public class CircleDemo extends View{    //定义起始数据为0 progress不是进度的意思,只是一个变量名,用来加减数据的    private int progress = 0;    private OnCircleDemoListen listen;    interface OnCircleDemoListen{        void onProgressUpdated(int progress);    }    public void setOnCircleDemoListen(OnCircleDemoListen listen)    {        this.listen = listen;    }    //有参和无参构造    public int getProgress() {        return progress;    }    public void setProgress(int progress) {        this.progress = progress;        //刷新的放法(系统方法)        postInvalidate();        if(listen!=null)        {            listen.onProgressUpdated(progress);        }    }    public CircleDemo(Context context) {        this(context,null);    }    public CircleDemo(Context context, @Nullable AttributeSet attrs) {        this(context, attrs,0);    }    public CircleDemo(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //取出屏幕的宽高        int width = getWidth();        int height = getHeight();        //取出宽高中的最小值作为圆的直径        int min = Math.min(width, height);        //计算圆的半径        int radius = min/2;        //画圆(参数是让圆没有卡卡的)        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setColor(Color.BLACK);        //让圆不填充        paint.setStyle(Paint.Style.STROKE);        canvas.drawCircle(width/2,height/2,radius,paint);        paint.reset();        //开始画扇形        paint.setColor(Color.RED);        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeWidth(30);        RectF rectF = new RectF();        rectF.set(0,155,min,min+100);        canvas.drawArc(rectF,-90,progress*360/100,true,paint);        //画中心圆        paint.reset();        paint.setColor(Color.WHITE);        paint.setStyle(Paint.Style.FILL);        canvas.drawCircle(width/2,height/2,radius-30,paint);        //画文字        paint.reset();        int intt = 10;        paint.setColor(Color.BLUE);        paint.setTextSize(40);        Rect rect = new Rect();        paint.getTextBounds(progress+"",0,String.valueOf(progress).length(),rect);        int width1 = rect.width();        int height1 = rect.height();        canvas.drawText(progress+"%",radius-width1/2,radius-height1/2,paint);    }}