最近项目中,出现一个问题,要做成的效果是这样的,但是一进去就变成这样了,
后来发现,刚进去是正常的,一闪而过,就变成全部了。
界面绘制过程,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; } } }
时就出现了背景色。