我一直在 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
肯定被调用了,因为我在日志中看到坐标调试消息。
有人能指出我做错了什么傻事吗?
最佳答案
您应该在 onTouchEvent() 结束时调用 invalidate() 来告诉系统更新屏幕。调用 invalidate() 将调用 onDraw()。
此外,根本错误在于您在您拥有的此类中创建了 Canvas 。那对你绝对没有任何作用。要绘制的 Canvas 是您从 onDraw() 方法获得的 Canvas 。在 onTouchevent 中对 canvas.drawLine() 的调用没有为您做任何事情,不应该在那里。那是一张空 Canvas ,不会被“发布”。
在 onTouchEvent() 中,您应该只收集触摸事件数据,并在需要时对其进行一些处理。您不应该在那里调用任何绘图方法。然而,正如我所说,如果你想从 onTouchEvent() 触发绘制,你可以调用 invalidate()。如果您想根据触摸的位置绘制线条,则需要创建 X 和 Y 坐标的类变量。您在 onTouchEvent() 中更新这些 X 和 Y 变量,然后在 onDraw() 中使用它们根据这些 X 和 y 变量绘制您需要的任何内容。
关于android - 在 Canvas onDraw 上绘图有效,在 TouchEvent 上绘图无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12062497/