1

在我的项目中,我有一个视图,它绘制了一个画布。

当加载活动/片段时,一切都很好,并且图像被正确渲染。

但是当方向改变时,它会被部分渲染。这里有两个例子:

  1. 这里是正确的渲染

这是正确的渲染

2.这是方向改变时的渲染:

画布的条形渲染

我编写的类扩展了 View,并覆盖了 onDraw() 方法。这是代码:

    @Override
protected void onDraw(Canvas canvas){       
     super.onDraw(canvas);  
     int size = this.width/2;
     int left = size/2;
     int right = size +left;
     canvas.drawRoundRect(resistorRects[0], 6, 6,resPaint[0]);      
     canvas.drawRect(resistorRects[FIRST_COLOR], resPaint[1]);       
     canvas.drawRect(resistorRects[SECOND_COLOR], resPaint[2]);
     canvas.drawRect(resistorRects[THIRD_COLOR], resPaint[3]);
     canvas.drawRect(resistorRects[MULTIPLIER], resPaint[4]);
     canvas.drawRect(resistorRects[TOLERANCE], resPaint[5]);
     canvas.drawLine((float)left-15, (float)16.5, (float)left, (float)17.5, resPaint[6]);
     canvas.drawLine((float)right, (float)16.5, (float)right+15, (float)17.5, resPaint[6]);
}   

该类的构造函数是:

    public ResistorGraphicsView(Context context, int width) {       
    super(context);     
    this.width = width;     
    int i=0;        
    resPaint = new Paint[7];
    resistorRects = new RectF[6];
    while(i < 6){
        resPaint[i] = new Paint(Paint.ANTI_ALIAS_FLAG);
        resPaint[i].setColor(Color.parseColor("#DEADBEEF"));
        i++;
    }
    int size = this.width/2;
    int left = size/2;
    int right = size +left;
    resPaint[6] = new Paint(Paint.ANTI_ALIAS_FLAG);
    resPaint[6].setColor(Color.parseColor("#FFFFFFFF"));


    resistorRects[0]= new RectF(left,0,right,35);               
    resistorRects[FIRST_COLOR]= new RectF(left+10,0,left+20,35);
    resistorRects[SECOND_COLOR]= new RectF(left+30,0,left+40,35);
    resistorRects[THIRD_COLOR] = new RectF(left+50,0, left+60,35);
    resistorRects[MULTIPLIER]= new RectF(left+70,0,left+80,35);
    resistorRects[TOLERANCE]= new RectF(right-30,0,right-20,35);                        
}

奇怪的事实是,当我选择扩展布局的选项时,在侧窗格中,图像被正确渲染:

case RESISTOR_VALUE:
    getFragmentManager().beginTransaction().replace(R.id.activity_container, new ResistorCalcFragment()).commit();
        break;

事实上,如果在糟糕的渲染之后,我从侧窗格中选择它,那么视图就会正确渲染。

我试图添加一些断点,似乎一切都被正确调用了。请注意,每次旋转视图时,我都会创建该对象的新实例。

4

0 回答 0