android - 在 Canvas onDraw 上绘图有效,在 TouchEvent 上绘图无效

标签 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 肯定被调用了,因为我在日志中看到坐标调试消息。

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

最佳答案

您应该在 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/

相关文章:

javascript - 将大型 Base64 字符串发布到服务器

html - 为什么 HTML Canvas rounded lineCap 对于最后一段失败?

android - 找不到 @style/Widget.Holo.ActionBar.TabView 的资源

java - 安卓 ;确认应用程序退出

android - Xamarin ARcore 改变 3D 对象的位置

java - Android Java - 如何嵌入在线视频

c# - 在 Canvas 内实例化预制件

canvas - 如何在发送到服务器之前减小 Canvas 图像的大小

WPF Canvas 和放置项目

安卓 : java. lang.OutOfMemoryError : Failed to allocate with free bytes and 70MB until OOM when using gson. toJson()