Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何随时在视图上绘制形状和线条?_Java_Android_Canvas_Draw - Fatal编程技术网

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
    ,并在构造函数中初始化它

  • 有关完整的工作示例,请参见Android开发者,自定义绘图:

    我想到了一个解决方案,它是有效的!我删除了自定义视图中的
    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);
            }
        });