【问题标题】:Drawing to canvas onDraw works, drawing onTouchEvent doesn't绘制到画布 onDraw 有效,绘制 onTouchEvent 无效
【发布时间】:2013-06-25 08:23:13
【问题描述】:

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

谁能指出我做错了什么愚蠢的事情?

【问题讨论】:

    标签: android canvas


    【解决方案1】:

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

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

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

    【讨论】:

    • 知道了。所以我需要重构,以便我的所有绘图都发生在onDraw 事件中。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        相关资源
        最近更新 更多