【问题标题】:Android SurfaceView Canvas LayersAndroid SurfaceView 画布层
【发布时间】:2015-09-14 13:19:32
【问题描述】:

我正在尝试制作一个应用程序,您可以在其中拍摄图像并将“贴纸”(多个位图图像)应用于图像。然后允许用户转换(平移、缩放和旋转)每个单独的“贴纸”。我目前正在使用SurfaceViewCanvas 将每个位图绘制到Canvas。它允许用户直接转换位图,并将该位图绘制到onDraw() 函数中的Canvas 上。虽然目前,我只能有效地操纵最后绘制的“贴纸”。

我想让它让用户可以直接操作每个单独的“贴纸”。所以我目前的想法是我必须创建多个贴纸图层(即 Photoshop 图层),并在onTouchEvent() 期间确定正在触摸哪个贴纸,将该图层带到堆栈的前面并操作该图层。为此,我认为我必须创建多个Canvas 对象以用作图层,然后将每个“贴纸”绘制到单个Canvas。然后onTouchEvent 将在每个Canvas 上调用getDrawingCache(),通过在该绘图缓存上调用getPixel() 来检测正在触摸哪个贴纸,并确定像素是否透明。

我的问题本质上是如何将所有这些Canvas 对象绘制到SurfaceView?这是获得我想要的效果的最佳方式吗?

我知道SurfaceView 只需要一个Canvas,因此我必须事先将每个Canvas 绘制到一个Canvas 上?如果是这样的话,当我合并它们时,这些Canvas 对象中的每一个是否会保持它们的转换完好无损?或者我是否必须在每个 Canvas 对象中操作位图而不是 Canvas 本身?

【问题讨论】:

    标签: android bitmap android-canvas surfaceview layer


    【解决方案1】:

    SurfaceView 不采用 Canvas,它提供 Canvas - 请注意 Canvas 是来自lockCanvas() 的返回值,而不是参数。 (这是unlockCanvasAndPost()的一个论据,这有点不幸。)

    我认为做你想做的最好的方法是使用屏幕外位图,你create your own Canvas。在屏幕外进行所有渲染,然后使用单个位图绘制调用将组合的位图 blit 到 SurfaceView 上。

    我还应该指出,如果您使用onDraw(),则您有渲染到视图部分而不是表面部分的风险。我建议不要对 SurfaceView 进行子类化,除非您打算同时使用两者。如果您认为 onDraw() 是您真正想要的,那么您应该考虑使用 custom View 并避免不必要的 Surface 开销。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多