【安卓】Android自定义View环形进度条,适用于网络加载Loding

先上图,再说话:

 然后是核心类的编写

public class ProgressView extends View {
    private Context context;
    private Paint paint;
    private AlertDialog dialog;
    private String text;
    private int progress = 0;
    private int Angle;
    private int incolor;
    private int procolor;
    private int roundwidth = 20;
    private int i=1;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            setProgress(i);
            setText(getProgress()+"%");
            if(i<100){
                add();
                i++;
            }else {
                i=0;
                dialog.dismiss();
            }
        }
    };

    private void add() {
        handler.sendEmptyMessageDelayed(1,30);
    }

    public ProgressView(Context context) {
        super(context);
        this.context = context;
        init(context);
    }

    public void show() {
        dialog.show();
        dialog.setCanceledOnTouchOutside(false);
        Window window = dialog.getWindow();
        window.setBackgroundDrawableResource(R.color.tm);
        window.setLayout(300,300);
        WindowManager.LayoutParams pl = window.getAttributes();
        pl.dimAmount = 0.2f;
        window.setAttributes(pl);
        add();
    }

    public void dismiss() {
        dialog.dismiss();
    }


    private void init(Context context) {
        paint = new Paint();
        dialog = new AlertDialog.Builder(context).setView(this).create();
        incolor = getResources().getColor(R.color.colorPrimary);
        procolor = getResources().getColor(R.color.colorAccent);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int center = getWidth()/2;
        int redius = (center - roundwidth /2 );

        paint.setColor(Color.WHITE);
        paint.setStrokeWidth(roundwidth);
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        canvas.drawCircle(center,center,redius-roundwidth,paint);
        canvas.save();

        paint.setColor(incolor);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(roundwidth);
        paint.setStyle(Paint.Style.STROKE);
        redius = redius - roundwidth;
        canvas.drawCircle(center,center,redius,paint);

        paint.setColor(procolor);
        RectF rectF = new RectF(center-redius,center-redius,
                center+redius,center+redius);
        canvas.drawArc(rectF,-90,Angle,false,paint);

        canvas.save();

        paint.setStyle(Paint.Style.FILL);
        canvas.translate(center,center);
        canvas.rotate(Angle-90);
        canvas.translate(redius,0);
        canvas.drawCircle(0,0,roundwidth,paint);
        canvas.restore();

        canvas.translate(center,center);
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(0);
        if(!TextUtils.isEmpty(text)){
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            paint.setTextSize(redius/text.length());
            float tw = paint.measureText(text);
            canvas.drawText(text,-tw/2,redius/text.length()/2,paint);
        }

    }

    public String getText() {
        return text;
    }

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

    public int getProgress() {
        return progress;
    }

    public void setProgress(int progress) {
        this.progress = progress;
        Angle = 360 * progress/100;
        invalidate();
    }
}

 再加上简单的调用

ProgressView pv = new ProgressView(this);
pv.show();//显示
pv.dismiss();//销毁

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值