【问题标题】:How to dynamically draw bitmaps to a Canvas in Android?如何在 Android 中将位图动态绘制到 Canvas?
【发布时间】:2015-07-15 06:14:14
【问题描述】:

这是问题的场景。 一个自定义视图,它是我需要在其上绘制的画布。 它下面有2个按钮,我们称它们为A和B 单击 A -> 图像 A 被绘制到上面的画布上。 单击 B 时 -> 将图像 B 绘制到上面的画布上。

问题要求必须保留先前在画布上绘制的图像。也就是说,如果您单击按钮 A,然后单击按钮 B,则画布必须包含两个图像。所以需要保留之前的图片。

问题:你是如何做到这一点的? 可能的解决方案 1:创建一个 ArrayList 并继续向该 arrayList 添加图像。将更新后的 arrayList 传递给画布的 onDraw 方法,并为每次按钮单击重绘每一个图像。

可能的解决方案 2:必须有一些方法来保留画布的状态,以便在每个按钮上单击您在画布的最后保留状态上绘制并仅绘制新图像。

进一步要求:绘制到画布的图像可以拖动,因此需要跟踪更新的位置。

我陷入了僵局,找不到解决此类要求的好教程或书籍,不胜感激。

【问题讨论】:

    标签: android canvas bitmap


    【解决方案1】:

    您可以创建位图,并在其上绘制您想要的内容。

    Bitmap mBitmap;
    
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (changed) {
            if (mBitmap != null) {
                mBitmap.recycle();
                mBitmap = null;
            }
            mBitmap = Bitmap.createBitmap(right - left, bottom - top, Bitmap.Config.ARGB_8888);
            redrawAllYourStuffTo(mBitmap);
        }
    }
    

    当按钮被按下时,你可以直接画到位图上,像这样:

    Canvas canvas = new Canvas(mBitmap);
    canvas. ... // draw operations.
    
    // after the bitmap canvas drawing finished, call
    invalidate();
    

    onDraw中只画你的位图

    protected void onDraw(Canvas canvas) {
       canvas.drawBitmap(mBitmap, 0, 0, null);
    }
    

    【讨论】:

    • 嘿,谢谢它的工作。现在转到进一步的需求部分,即拖动图像。我想我必须为我在这些位图上所做的每一次翻译重新绘制画布。为此,我需要创建一个位图数组列表,并在每次调用 onDraw 方法时再次绘制它们。有没有更好的办法?
    • 如果可移动元素的数量很大(即每帧重绘它们需要很长时间),您可以创建两个位图。当运动开始时,将所有底层图像绘制在一个上,全部覆盖在另一个上。在 onDraw 中,您可以只绘制底部位图,然后是可移动图像,然后是顶部位图。移动完成后,将它们重新组合回来。这可以显着改善 UI 响应和用户体验。
    • 谢谢,我会试试这个。问题是我可能拥有动态数量的图像,我需要跟踪每一个图像坐标。图像甚至可以缩放或旋转,这就是最终目标。我想知道什么时候开发了这么多游戏,即使是那些开发人员也一定会遇到处理每个精灵的相同问题。他们是如何实现的?他们是否为画布上的每次更改绘制每个精灵?在我的例子中,每个位图就像一个单独的精灵。
    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2011-11-18
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多