【问题标题】:Getting Bitmap from Custom SurfaceView从自定义 SurfaceView 获取位图
【发布时间】:2012-12-20 07:54:08
【问题描述】:

我在一个扩展表面视图并实现可运行的类中有这段代码 我能够使用该类基本上允许您使用不同的颜色等绘制到画布上。我正在尝试获得一种方法,该方法允许我在绘制图像后保存图像,这就是方法。无论我做什么,我都会得到一个黑色的图像,上面什么都没有。有什么想法吗?

我已启用缓存绘图

Objective 从自定义 SurfaceView 获取位图图像我已经用尽了在这里查看其他帖子的选项,但没有找到任何工作。希望最近有一个新的解决方案。非常感谢

public Bitmap getImage() {
            Bitmap bitmap = Bitmap.createBitmap(this.getWidth(),
                    this.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            this.draw(canvas);
            return bitmap;
        }

【问题讨论】:

  • 您希望this.getWidth()this.getHeight() 给予什么?
  • 您正在创建一个新的位图,上面没有任何内容。然后你从那个空白位图创建一个画布。你没画过,怎么能指望画呢?请注意:如果您要覆盖 SurfaceView 的 onDraw() 方法,请务必在您的类构造函数中调用 setWillNotDraw(false)
  • 我希望得到surfaceview的宽度和高度,因为这是我正在扩展的类。
  • 我想发生的是我创建了一个新的空白位图,它具有我的表面视图的尺寸。我有一个将绘制到我的位图的新画布。然后我调用 this.draw 绘制到我的画布,然后绘制到位图?我想错了吗?我猜我一定是
  • 来自 developer.android.com 用指定的位图构造一个画布来绘制。位图必须是可变的。画布的初始目标密度与给定位图的密度相同。参数 bitmap 为要绘制的画布指定一个可变位图。

标签: android bitmap android-canvas surfaceview extends


【解决方案1】:

只有在您最后的评论中,您的问题才变得清晰。在您上面发布的代码中,您返回的是return bitmap。这将返回局部变量bitmap。这个局部变量是完全空白的。您可能正在代码中的其他位置绘制位图或将图像与其相关联。但是上面代码中位图的 instance 是空白的,并且仅在函数中是本地的。您不能期望它返回您更新的最新位图。

现在,在您发表评论后,我在 Google 上搜索了“获取当前表面视图的位图”,结果我得到了这样的答案:Create Bitmap from SurfaceView

在那个问题中,显然是通过扩展 View 而不是 SurfaceView 来解决的。绘图缓存仅适用于 View。

更新:遵循以下教程。根据您粘贴的代码,尚不清楚错误是什么。绘制到 SurfaceView 需要做很多事情,我不确定你是否已经完成了这些,我不能要求每一个这样的缺失项目。我按照以下教程进行了基本图形项目。您需要阅读它们,看看是否遗漏了什么。

Canvas 绘图教程:

Playing with Graphics in android所有部分。

Android 2D

【讨论】:

  • 一定有办法的。我见过其他人成功使用它。只是没有编码。我在它不起作用之前使用了一个视图,因为它的性能没有那么快。我现在尝试做的是制作一个字段图像和画布。然后我将图像放入画布中,当我调用 onDraw 时,我只是发送我的画布而不是他们想要的画布。仍然没有工作......知道什么吸引了surfaceView以及何时调用它。所以我可以插入我的画布而不是它使用的画布。
  • 为了不让 SurfaceView 本身绘制到画布上,并让您自己的 onDraw() 完成任务,请从您的类构造函数中调用 setWillNotDraw(false)
  • 谢谢你,我已经包含了它。叹息仍然无法从中获得图像。我在 onDraw 中有一个日志,我只在第一次打开应用程序时才看到它被调用。当我绘制到表面视图时它没有被调用?什么时候被偶然调用?
  • 当你调用invalidate() 你的onDraw() 被再次调用。我的建议是,在新线程中绘制您的图纸。在Thread的run()方法中,可以更新Canvas并调用invalidate()。这将调用onDraw() 并显示更新的画布。 run() 在线程创建时也被调用一次,因此您必须在 run() 内实现 while(true) 无限循环以不断更新您的绘图。
  • 我不能调用 invalidate 因为只有创建它的线程才能访问它。刚试过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2014-07-16
相关资源
最近更新 更多