onDraw方法之外的Android图形

时间:2011-12-03 03:42:39

标签: android graphics android-canvas

好的,所以我试图从onDraw方法之外的Android上绘制画布。

显示我的代码最简单:

public class TestActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Paint p = new Paint();
    p.setColor(Color.GREEN);
    Panel a = new Panel(this,150,150,50,p);
    a.drawThing();
   setContentView(a);

}
class Panel extends View{
    private float radius, x, y;
    private Canvas CAN; 
    private Paint p;
    public Panel(Context context, float x, float y, float radius, Paint p){
        super(context);
        this.x = x;
        this.y = y;
        this.radius = radius;
        this.p = p;

    }
    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        CAN = canvas;

    }

    public void drawThing(){
        CAN.drawCircle(x, y, radius, p);
    }
}
}

你看到我想要做什么吗?但出于某种原因,它会抛出NullPointerException

3 个答案:

答案 0 :(得分:4)

许多图形资源在使用后都会被显式释放/释放。我不确定他们为什么要这样做,但无论出于什么原因,他们都不会做你正在尝试的事情。

使用某种标志来改变onDraw方法正在做的事情,而不是在onDraw方法之外绘制。当您想绘制某些特定内容时,可以设置正确的标记,然后调用invalidate()

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);
    if (doThing) {
        canvas.drawCircle(x, y, radius, p);
    }
}

修改
还需要考虑的其他因素是“吸引人”。这意味着使用某种图形表示,如位图作为缓冲区,您可以在其他代码中绘制。这不会更新您的gui,但它会让您有机会在不锁定用户设备的情况下进行重型绘图。完成绘制到位图(或其他)之后,您可以使视图无效并使用onDraw(Canvas)方法将其绘制到屏幕上。

答案 1 :(得分:1)

我很确定空指针的发生是因为你在调用onDraw之前调用了drawSomething。所以CAN是空的。

答案 2 :(得分:0)

您可以在onDraw外部绘制到画布上。有关详细信息,请参阅此Can we have two canvases in an activity ? (OR) Having a canvas outside the onDraw() is not working