1

我在 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,0画了一条线。500,500那部分工作得很好。

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

有人可以指出我做错了什么愚蠢的事情吗?

4

3 回答 3

8

你应该在 onTouchEvent() 结束时调用 invalidate() 来告诉系统更新屏幕。调用 invalidate() 将调用 onDraw()。

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

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

于 2012-08-21T20:28:32.040 回答
0

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

于 2013-06-24T23:56:18.110 回答
0

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

于 2012-08-21T20:55:24.337 回答