Android 表面视图 Canvas 层
Android SurfaceView Canvas Layers
我正在尝试制作一个应用程序,您可以在其中拍摄图像并将 'stickers'(多位图图像)应用于图像。然后允许用户变换(平移、缩放和旋转)每个个体 'sticker'。我目前正在使用 SurfaceView
和 Canvas
将每个位图绘制到那个 Canvas
。它允许用户直接转换位图,并且该位图被绘制到 onDraw()
函数中的 Canvas
上。虽然目前,我只能有效地操作最后绘制的'sticker'。
我想做的是让用户可以直接操作每个人'sticker'。所以我目前的想法是,我必须创建多层贴纸(即 Photoshop 层),并在 onTouchEvent()
期间确定哪个贴纸被触摸,将该层带到堆栈的前面并操纵该层。为此,我想我必须创建多个 Canvas
对象以用作图层,然后将每个 'sticker' 绘制到单个 Canvas
。然后 onTouchEvent
会在每个 Canvas
上调用 getDrawingCache()
,通过在绘图缓存上调用 getPixel()
来检测哪个贴纸被触摸,并确定像素是否透明。
我的问题本质上是如何将所有这些 Canvas
对象绘制到 SurfaceView
?这是达到我想要的效果的最佳方式吗?
我知道 SurfaceView
只需要一个 Canvas
,所以我必须事先将每个 Canvas
画成一个 Canvas
?如果是这样的话,当我合并它们时,这些 Canvas
对象中的每一个都会保持它们的转换吗?或者我是否必须在每个 Canvas
对象而不是 Canvas
本身内操作位图?
SurfaceView 不接受一个Canvas,它提供一个Canvas——注意Canvas 是来自 lockCanvas()
的 return 值,不是参数。 (这是 unlockCanvasAndPost()
的一个参数,有点不幸。)
我认为做你想做的最好的方法是使用屏幕外位图,你 create your own Canvas。在屏幕外进行所有渲染,然后使用单个位图绘制调用将组合的位图 blit 到 SurfaceView 上。
我还应该指出,如果您使用 onDraw()
,您将面临渲染到视图部分而不是表面部分的风险。我建议不要对 SurfaceView 进行子类化,除非您打算同时利用两者。如果您认为 onDraw()
是您真正想要的,那么您应该考虑使用 custom View 并避免不必要的 Surface 开销。
我正在尝试制作一个应用程序,您可以在其中拍摄图像并将 'stickers'(多位图图像)应用于图像。然后允许用户变换(平移、缩放和旋转)每个个体 'sticker'。我目前正在使用 SurfaceView
和 Canvas
将每个位图绘制到那个 Canvas
。它允许用户直接转换位图,并且该位图被绘制到 onDraw()
函数中的 Canvas
上。虽然目前,我只能有效地操作最后绘制的'sticker'。
我想做的是让用户可以直接操作每个人'sticker'。所以我目前的想法是,我必须创建多层贴纸(即 Photoshop 层),并在 onTouchEvent()
期间确定哪个贴纸被触摸,将该层带到堆栈的前面并操纵该层。为此,我想我必须创建多个 Canvas
对象以用作图层,然后将每个 'sticker' 绘制到单个 Canvas
。然后 onTouchEvent
会在每个 Canvas
上调用 getDrawingCache()
,通过在绘图缓存上调用 getPixel()
来检测哪个贴纸被触摸,并确定像素是否透明。
我的问题本质上是如何将所有这些 Canvas
对象绘制到 SurfaceView
?这是达到我想要的效果的最佳方式吗?
我知道 SurfaceView
只需要一个 Canvas
,所以我必须事先将每个 Canvas
画成一个 Canvas
?如果是这样的话,当我合并它们时,这些 Canvas
对象中的每一个都会保持它们的转换吗?或者我是否必须在每个 Canvas
对象而不是 Canvas
本身内操作位图?
SurfaceView 不接受一个Canvas,它提供一个Canvas——注意Canvas 是来自 lockCanvas()
的 return 值,不是参数。 (这是 unlockCanvasAndPost()
的一个参数,有点不幸。)
我认为做你想做的最好的方法是使用屏幕外位图,你 create your own Canvas。在屏幕外进行所有渲染,然后使用单个位图绘制调用将组合的位图 blit 到 SurfaceView 上。
我还应该指出,如果您使用 onDraw()
,您将面临渲染到视图部分而不是表面部分的风险。我建议不要对 SurfaceView 进行子类化,除非您打算同时利用两者。如果您认为 onDraw()
是您真正想要的,那么您应该考虑使用 custom View 并避免不必要的 Surface 开销。