好的,所以我试图从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
答案 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。