Java 在何处初始化点变量/绘制方法给出警告

Java 在何处初始化点变量/绘制方法给出警告,java,android,Java,Android,我有一个绘制方法,如下所示: protected void onDraw(Canvas canvas) { canvas.drawColor(Color.TRANSPARENT); a = new Point(0, 0); b = new Point(canvas.getWidth(), canvas.getHeight()/2); c = new Point(canvas.getWidth(),0);

我有一个绘制方法,如下所示:

protected void onDraw(Canvas canvas) {


        canvas.drawColor(Color.TRANSPARENT);
        a = new Point(0, 0);
        b = new Point(canvas.getWidth(), canvas.getHeight()/2);
        c = new Point(canvas.getWidth(),0);




        path.moveTo(a.x, a.y);
        path.lineTo(b.x, b.y);
        path.lineTo(c.x, c.y);
        path.lineTo(a.x, a.y);
        path.close();

        canvas.drawPath(path, paint);

        canvas.rotate(36);
        paint.setColor(Color.WHITE);
        canvas.drawText(text_to_disp, (canvas.getHeight()/4),0- 15, paint_text);

    }
这里的争论是点变量的init,我在eclipse中得到一个警告:
在绘制/布局操作期间避免对象分配(而是预分配和重用)

然而,我在这个类的任何其他方法中都没有得到对canvas的引用,我如何在其他地方初始化这些变量呢

我也有这个方法:

public void init(){

        paint = new Paint();
        paint.setStrokeWidth(4);
        paint.setColor(android.graphics.Color.RED);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setAntiAlias(true);
        paint.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);
        setLayerType(LAYER_TYPE_SOFTWARE, paint);
        path = new Path();
        path.setFillType(FillType.EVEN_ODD);

        paint_text = new Paint(); 
        helv_light = Typeface.createFromAsset(MainAct_Demo.con.getAssets(), pathHelv_light);
        paint_text.setTypeface(helv_light);
        paint_text.setTextSize(32);
        paint_text.setAntiAlias(true);
        paint_text.setColor(android.graphics.Color.WHITE);
    }

在draw方法中收到避免分配的警告的原因是,可能会连续多次调用draw方法,例如在滚动或动画操作期间。对象分配是一个相当昂贵的过程,在基本绘图例程中通常是不必要的

在控制器的构造函数中分配点对象,并将其存储为成员变量。然后在draw方法中,可以在使用它们之前根据需要指定它们各自的坐标


但是,考虑一下你实际上需要点对象,考虑到你只是把它们分解成原始坐标。使用简单的浮点变量计算宽度和高度的相对坐标

点一起去掉。而不是
path.moveTo(a.x,a.y)path.moveTo(0,0)而不是
path.lineTo(b.x,b.y)只需使用path.lineTo(canvas.getWidth(),canvas.getHeight()/2)等。。现在,您不必每次调用
onDraw()
,都创建3个新对象,这可能会非常多。是的,当我在列表视图中使用它时,我可以感觉到延迟。您基本上是创建3个对象,向其中插入数据,然后立即使用刚才插入的数据。你可以省去大部分过程,直接使用数据,我在init方法中这样做,从构造函数调用它。但是我如何在onDraw之外引用画布呢?有没有一种有效的方法,我只想在listview行上画一个三角形。在init方法中实例化Point对象,但将它们全部设置为0,0。然后在draw方法中设置b.x=canvas.GetWidth()等。