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

时间:2012-08-21 20:24:40

标签: 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;
    }
}

上面的代码在应用开始时从0,0500,500绘制一条线。那部分工作得很好。

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

调用postInvalidate()函数。此函数通知应该重绘视图(事件循环调用onDraw()函数)。

答案 2 :(得分:0)

你可以在你的类中声明一个bool变量,这样你就可以将它传递给用户触摸过的ondraw()方法,并将X和Y与其他浮点变量一起传递给ondraw()方法! 但你必须在onTouchEvet()中输出无效,以便系统使用新的触摸订单重绘画布!