【问题标题】:rotating android.graphics.picture object on SurfaceView without a bitmap conversion?在没有位图转换的情况下在 SurfaceView 上旋转 android.graphics.picture 对象?
【发布时间】:2013-10-19 01:19:57
【问题描述】:

无法将 android.graphics.图片 对象旋转,但可以翻译。 以下代码中不涉及摄像头

为了制作动态精灵,记录将基元绘制到 android.graphics 中。图片对象以供以后使用似乎始终比单独进行更有效在 onDraw 期间进行原始绘制。并且 Picture 对象与位图非常相似(如果不一样?)并且可以保存和恢复到位图/从位图恢复。

但是,为了能够旋转这些图片,我想避免在recording() 之后将它们保存为位图。也就是说,只需使用像位图这样的图片对象,canvas api 似乎暗示这是可能的。也许图片 API 不那么复杂,但更有可能我只是做错了。

位图与图片的画布 API 不是并行的,例如有一个:

    canvas.drawBitmap(bitmap_Sprite, matrix, null); // Draw sprite with matrix, no Paint

还有一个:

    canvas.drawPicture(picture_Sprite, destination_rectangle); Draw sprite into rect.

但是没有

    canvas.drawPicture(picture_Sprite, matrix ...)
  • 详情

想象一下 bitmap_Sprite 和 picture_Sprite 都是一个“指南针箭头”,指示它在旋转过程中指向的位置。

在 onDraw() 调用中,使用位图版本,这是可行的:

     matrix = new matrix();
     matrix.setRotate(angle);  // angle is ++ during onDraw(canvas)

     // Draw arrow, matrix rotates it as expected:
     canvas.drawBitmap(bitmap_Sprite, matrix, null); // null = no Paint obj

但是尝试使用图片对象做同样的事情,我能弄清楚的唯一方法是像这样旋转destination_rectangle(包含箭头):

     //destination_rectangle sized correctly to wrap previously recorded picture obj.
     matrix2 = new matrix();
     matrix2.setRotate(angle);  // angle is ++ during onDraw(canvas)

     matrix2.mapRect(destination_rectangle); // apply rotation
     canvas.drawPicture(picture_Sprite, destination_rectangle);

但这只是pivot围绕某个位置的矩形,它不会旋转矩形(和箭头)本身。

  • 问题:
    • 正在使用目标矩形。这样做的方法不对?
    • 是否可以使用 Picture 对象进行旋转?

当然,如果我不能让图片对象旋转,那么我可以直接使用以前创建的位图/mipmap。那么

  • 一般来说,假设可以像使用位图一样使用图片对象,我是否真的可以使用动态创建一次的图片来节省开销,而不是动态创建它们,将它们保存为位图,然后重新加载位图来处理矩阵内容?(!)

【问题讨论】:

    标签: android bitmap rotation


    【解决方案1】:

    只需使用 Canvas.concat,您可能还需要保存/恢复

    【讨论】:

    • 超级! +5 当我发布一个巨大的问题时,我只是喜欢它 - 并得到一个准确的单行答案。永远不会猜到 .concat ... 保存/恢复有点奇怪,因为 canvas.drawPicture 自己保存/恢复,但至少 Picture 对象现在按预期旋转!对开销问题有任何想法吗?
    • 哎呀,忘了 Canvas.setMatrix 它可以更快,因为它完全替换了矩阵
    • 好的,感谢您的帮助,让这个工作正常了! Canvas.setMatrix 确实有效,但在文档中不鼓励使用(但没有说明原因)。此外,与 Canvas.concat 相比,setMatrix 似乎根本不会影响帧速率。 (但是,我只以 20-25 fps 的速度运行,这对于这个特定的应用程序来说已经足够了。)保存和恢复在这里也无关紧要,可能是因为我上面的第一条评论。调用的顺序当然很重要,不仅仅是因为矩阵数学。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2021-12-27
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多