我在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
肯定被调用,因为我在日志中看到了坐标调试消息。
有人能指出我做错了什么傻事吗?
答案 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()
中输出无效,以便系统使用新的触摸订单重绘画布!