关于界面绘制过程多次回调ondraw()方法产生的问题

最近项目中,出现一个问题,要做成的效果是这样的,但是一进去就变成这样了,

后来发现,刚进去是正常的,一闪而过,就变成全部了。

界面绘制过程,ondraw() 会被多次回调。

就是说在第一次绘制的时候是可以的,后面的绘制出现了问题,后来发现绘制轨道和阴影渐变色用的是同一个paint对象,

猜测是paint对象的属性被设置过了。果然是第一次设置了阴影颜色之后,第二次绘制时属性还在,于是绘制进度条轨道

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

        int centre = getWidth() / 2; 
        int radius = (int) (centre - roundWidth / 2); 
        
        paint.setColor(getResources().getColor(R.color.proessround));
        paint.setStyle(Paint.Style.STROKE);
   paint.setStrokeWidth(roundWidth); paint.setAntiAlias(
true);
    //关键语句:设置进度条轨道时应该设置背景色为空
paint.setShader(
null); canvas.drawCircle(centre, centre, radius, paint); paint.setStrokeWidth(0); paint.setColor(textColor); paint.setTextSize(textSize); paint.setTypeface(Typeface.DEFAULT_BOLD); int percent = (int) (((float) progress / (float) max) * 100); float textWidth = paint.measureText(percent + "%"); if (textIsDisplayable && percent != 0 && style == STROKE) { canvas.drawText(percent + "%", centre - textWidth / 2, centre + textSize / 2, paint); } paint.setStrokeWidth(roundWidth); // paint.setColor(roundProgressColor); int[] mColors = new int[] {// 渐变色数组 0xFF0da7ff, 0xFF31da41, 0xFF31da41, 0xFF0da7ff ,0xFF0da7ff }; Shader sg = new SweepGradient(0, 0, mColors, null); SweepGradient sg2 = new SweepGradient(centre, centre, getResources() .getColor(R.color.proessstartcolor), getResources().getColor( R.color.proessendcolor)); paint.setShader(sg); RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); switch (style) { case STROKE: { Log.e("zhang", centre+"调试1:"+radius); paint.setStyle(Paint.Style.STROKE); canvas.drawArc(oval, -90, 360 * progress / max, false, paint); break; } case FILL: { Log.e("zhang", "调试2:"+360 * progress / max); paint.setStyle(Paint.Style.FILL_AND_STROKE); if (progress != 0) canvas.drawArc(oval, 0, 360 * progress / max, true, paint); break; } } }

时就出现了背景色。

原文地址:https://www.cnblogs.com/Jackie-zhang/p/5210436.html