自定义Progressbar

阅读原文

绘制圆环,圆弧,文本

自定义Progressbar_第1张图片
image
    /**
     * canvas:画布,对应着视图在布局中的范围区间。范围的左上顶点即为坐标原点
     *
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas)
    {
        //1.绘制圆环
        //获取圆心坐标
        int cx = width / 2;
        int cy = width / 2;
        float radius = width / 2 - roundWidth / 2;
        paint.setColor(roundColor);//设置画笔颜色
        paint.setStyle(Paint.Style.STROKE);//设置圆环的样式
        paint.setStrokeWidth(roundWidth);//设置圆环的宽度
        canvas.drawCircle(cx, cy, radius, paint);

        //2.绘制圆弧
        RectF rectF = new RectF(roundWidth / 2, roundWidth / 2, width - roundWidth / 2, width - roundWidth / 2);
        paint.setColor(roundProgressColor);//设置画笔颜色
        canvas.drawArc(rectF, 0, progress * 360 / max, false, paint);

        //3.绘制文本
        String text = progress * 100 / max + "%";
        //设置paint
        paint.setColor(textColor);
        paint.setTextSize(textSize);
        paint.setStrokeWidth(0);
        Rect rect = new Rect();//创建了一个矩形,此时矩形没有具体的宽度和高度
        paint.getTextBounds(text, 0, text.length(), rect);//此时的矩形的宽度和高度即为整好包裹文本的矩形的宽高
        //获取左下顶点的坐标
        int x = width / 2 - rect.width() / 2;
        int y = width / 2 + rect.height() / 2;


        canvas.drawText(text, x, y, paint);

    }

使用自定义属性

1. 什么是自定义属性?

定义可以在布局文件的标签中使用的属性。

2. 为什么要自定义视图属性?

这样就可以通过布局的方式给视图对象指定特定的属性值, 而不用动态的设置

3. 理解属性值的类型(format)

 1. reference 引用类型值 :@id/...

 2. color 颜色类型值  #ff00ff

 3. boolean 布尔类型值 true false

 4. dimension 尺寸类型值 dp / px /sp

 5.  integer 整数类型值  weight  progress max

 6. float 小数类型值  0.5f

 7. string 字符串类型值  ""

 8.  枚举类型值 :水平/垂直

4. 在values目录下创建attrs.xml




    
        
        
        
        
        
        
        


    



5. 在fragment_home.xml布局文件中引用自定义属性

在布局文件中引用当前应用的名称空间

//P2PInvest可随意命名,引用一致即可
xmlns:P2PInvest="http://schemas.android.com/apk/res-auto"

6. 使用自定义的圆形进度条和自定义属性


7. 在自定义View类的构造方法中, 取出布局中的自定义属性值

 public RoundProgress(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);

        //初始化画笔
        paint = new Paint();
        paint.setAntiAlias(true);//去除毛边

        //获取自定义的属性
        //1.获取TypeArray的对象(调用两个参数的方法)
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgress);

        //2.取出所有的自定义属性
        roundColor = typedArray.getColor(R.styleable.RoundProgress_roundColor, Color.GRAY);
        roundProgressColor = typedArray.getColor(R.styleable.RoundProgress_roundProgressColor, Color.RED);
        textColor = typedArray.getColor(R.styleable.RoundProgress_textColor, Color.GREEN);
        roundWidth = typedArray.getDimension(R.styleable.RoundProgress_roundWith, UIUtils.dp2px(10));
        textSize = typedArray.getDimension(R.styleable.RoundProgress_textSize, UIUtils.dp2px(20));
        max = typedArray.getInteger(R.styleable.RoundProgress_max, 100);
        progress = typedArray.getInteger(R.styleable.RoundProgress_progress, 30);

        //3.回收处理
        typedArray.recycle();
    }

8. 让圆环进度"动起来"

1.自定义RoundProgress类中提供进度属性的getter和setter方法

2.在HomeFragment的onSuccess()中:

totalProgress = Integer.parseInt(index.product.progress);

new Thread(runnable).start();

其中,属性runnable声明为:

//进度条的加载
private Runnable runnable = new Runnable()
    {
        @Override
        public void run()
        {
            roundProHome.setMax(100);
            for (int i = 0; i < currentProress; i++)
            {
                roundProHome.setProgress(i + 1);

                SystemClock.sleep(20);
                //强制重绘
//                roundProHome.invalidate();//只有主线程才可以如此调用
                roundProHome.postInvalidate();//主线程、分线程都可以如此调用
            }
        }
    };

你可能感兴趣的:(自定义Progressbar)