Java 如何随时在视图上绘制形状和线条?
“我想什么时候”是指当用户单击按钮或发生某种事件时,或者在Java 如何随时在视图上绘制形状和线条?,java,android,canvas,draw,Java,Android,Canvas,Draw,“我想什么时候”是指当用户单击按钮或发生某种事件时,或者在onCreate中,我可以在上面绘制新的内容。。。我找到了一些教程,他们说我应该创建一个自定义视图并覆盖onDraw。因此,我尝试了以下方法: public class CanvasView extends View { private Canvas canvas; private Paint paint; public Canvas getCanvas() { return canvas;
onCreate
中,我可以在上面绘制新的内容。。。我找到了一些教程,他们说我应该创建一个自定义视图并覆盖onDraw
。因此,我尝试了以下方法:
public class CanvasView extends View {
private Canvas canvas;
private Paint paint;
public Canvas getCanvas() {
return canvas;
}
public Paint getPaint () {
return paint;
}
public CanvasView (Context c) {
super(c);
paint = new Paint ();
paint.setColor (Color.BLACK);
paint.setStrokeWidth (5);
}
public CanvasView(Context context, AttributeSet attrs) {
super (context, attrs);
paint = new Paint ();
paint.setColor (Color.BLACK);
paint.setStrokeWidth (5);
}
public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) {
super (context, attrs, defStyleAttr);
paint = new Paint ();
paint.setColor (Color.BLACK);
paint.setStrokeWidth (5);
}
@Override
protected void onDraw (Canvas c) {
canvas = c;
}
}
也许我太天真了。我添加了一个名为canvas
的字段,并添加了一个getter。如您所见,在onDraw
方法中,我将canvas参数指定给字段。然后在onCreate
方法中,我做了如下操作:
canvas = (CanvasView)findViewById (R.id.canvas);
canvas.getCanvas ().drawLine (100, 100, 500, 100, canvas.getPaint ());
我认为我所做的真的很愚蠢。不管怎样,我运行了我的应用程序。。。NPE!我推断canvas.getCanvas()
为空
所以这个方法不起作用。我的代码有什么问题?如果我不应该这样做,我还可以使用什么其他视图来随时在上面绘制内容?您写道:
然后在onCreate方法中,我做了如下操作:
canvas=(CanvasView)findviewbyd(R.id.canvas);
canvas.getCanvas().drawLine(100100500100,canvas.getPaint())
onDraw(…)
中进行绘图。将canvas.drawline(…)移动到该方法canvas.drawLine(…)
而不是canvas.getCanvas().drawLine(…)
Paint
实例。不要执行canvas.getPaint()。创建一个字段mpain
,并在构造函数中初始化它我想到了一个解决方案,它是有效的!我删除了自定义视图中的
Canvas
字段以及Paint
字段。然后我创建了一个名为Shape
的界面:
public interface Shape {
void draw (Canvas c);
}
下面是新的CanvasView
类:
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import java.util.ArrayList;
public class CanvasView extends View {
private ArrayList<Shape> shapes;
public CanvasView (Context c) {
super(c);
init ();
}
public CanvasView(Context context, AttributeSet attrs) {
super (context, attrs);
init ();
}
public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) {
super (context, attrs, defStyleAttr);
init ();
}
private void init () {
shapes = new ArrayList<> ();
}
@Override
protected void onDraw (Canvas c) {
super.onDraw (c);
for (Shape s : shapes) {
s.draw (c);
}
}
public void addShape (Shape s) {
shapes.add (s);
}
public void clear () {
shapes.clear ();
}
}
我认为这是一个很好的方法。它基本上使用接口作为在画布上绘制形状的“委托”。调用
onDraw
时,它会在画布上绘制阵列列表中的所有形状。哦,参考类型之美 是的,我知道。但我要问的是如何在点击按钮或其他视图或在onCreate
等中绘制东西。
canvas.addShape (new Shape () {
@Override
public void draw(Canvas c) {
Paint p = new Paint ();
p.setColor (Color.BLACK);
p.setStrokeWidth (5);
c.drawLine (100, 100, 500, 100, p);
}
});