Android:为什么在onDraw()中无限循环?

时间:2012-11-19 13:58:03

标签: android android-canvas

我想通过使用for循环绘制几个饼图,数据存储在一个数组(data[][][])中。当每个图表绘制完成后,我将顶部和底部加上450(top+=450; bottom+=450;)以避免图表重叠。但结果是饼图不断移动到底部。我尝试在行尾添加invalidate(),但它不起作用。

private String data[][][]=... //store some data
private float left=50,top=100,right=450, bottom=500;

public void onDraw(Canvas c) {

    super.onDraw(c);
    Paint paint = new Paint();
    RectF rec;
    for(int j=0;j<data.length;j++){
        rec=new RectF(left,top,right,bottom);
        //draw a pie chart
        for (int i = 0; i < data[j].length; i++) {
            float drawDegree = (float)Integer.parseInt(data[j][i][1])/100* 360f;
            c.drawArc(rec, -90, drawDegree, true, paint);   
        }

        top+=450;
        bottom+=450;
    }           
}

2 个答案:

答案 0 :(得分:2)

topbottom是实例变量。尝试将它们设为本地,将它们移至onDraw方法。现在,每次onDraw调用时都会更改它们,并且在top=100,bottom=500完成后它们不会重置为onDraw

答案 1 :(得分:1)

你的问题的标题非常具有误导性......听起来并不像那里有无限循环。

您应该在onDraw函数中初始化top和bottom。所以每次画画都要从屏幕的“顶部”开始。

此外,您应该尝试不为每个饼图分配新的Rect。 尝试分配一个,使用offsetTo(50,100),然后使用offset(0, 450)将其移动。

每次调用invalidate()只会让您的饼图一次又一次地被绘制......可能不会有太多好处。