绘制到画布onDraw作品,绘制onTouchEvent不

Mar*_*iek 1 android canvas

我在Android SDK中愚弄2D图形,我遇到的问题应该是一个简单的例子.

我假设我只是误解了一些基本/基本的东西.

public class DrawView extends View {
    Paint paint = new Paint();
    Canvas canvas = new Canvas();

    public DrawView(Context context) {
        super(context);
        paint.setColor(Color.BLACK);
    }

    @Override
    public void onDraw(Canvas canvas) {
        this.canvas = canvas;
        this.canvas.drawLine(0,0, 500, 500, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("DrawView", "onTouchEvent: " + event.getX() + "," + event.getY() );

        canvas.drawLine(0,500, 500, 0, paint);

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码从绘制一条线0,0,以500,500当应用程序启动.那部分工作得很好.

问题是触摸事件没有绘制第二行.在onTouchEvent肯定被调用,因为我在日志中看到的坐标调试消息.

有人能指出我做错了什么傻事吗?

And*_*Jay 7

你应该在onTouchEvent()的末尾调用invalidate()来告诉系统更新屏幕.调用invalidate()将调用onDraw().

另外,根本上错的是你在这个类中创建了一个画布.这对你来说绝对没有任何意义.要绘制的画布是从onDraw()方法获得的画布.在onTouchevent中调用canvas.drawLine()并没有为你做任何事情,也不应该在那里.这是一个空白的画布,不会被"发布".

在onTouchEvent()中,您应该只收集触摸事件数据,并在需要时对其进行一些处理.你不应该在那里调用绘图方法.但是,正如我所说,如果你想从onTouchEvent()触发绘制,你可以调用invalidate().如果要根据触摸的位置绘制线条,则需要创建X和Y坐标的类变量.您可以在onTouchEvent()中更新这些X和Y变量,然后在onDraw()中使用它们根据这些X和y变量绘制所需的任何内容.