Android:绘制大位图,2层,最好的方法?

时间:2013-11-23 16:06:48

标签: android android-imageview android-image android-bitmap

我在app上工作,在imageview中显示大的(大约2000x2000px)位图。这个图像必须很大,因为用户可以捏缩放它以查看一些细节。应用程序必须能够在该图像上绘制圆圈,并且还可以单独显示图像,而不显示圆圈。我正在使用2层,但问题是内存,因为2k x 2k px大约是16mb的内存,而创建另一个位图(另外16mb),只是为了绘制几个圆圈,在我看来毫无意义。有没有办法,你可以在图像上绘制简单的图元,并且能够在没有图元的情况下显示它(在我的例子中是圆圈)? 也许某种程度上只存储修改过的像素或某事? 谢谢!

2 个答案:

答案 0 :(得分:1)

您不需要制作另一个2000x2000 Bitmap来绘制这些圈子。只是'prerender'一个圆圈,然后选择你绘制它的位置。

我假设你正在吸引你的大个子' Canvas上的图片,因为您有缩放功能等。

如果您不是,则需要覆盖SurfaceView的onDraw(Canvas canvas)方法,以便您可以访问SurfaceView Canvas。我不会深入了解那个部分,因为我再次假设你拥有它,但如果没有,那么该函数的实现将如下所示:

//Overriding SurfaceView onDraw(Canvas canvas)
@Override
protected void onDraw(Canvas surfaceCanvas) {
  if(canvas == null) return; //No Canvas? No point in drawing then.
  surfaceCanvas.drawColor(Color.BLACK);
  //Draw your 'big' image on the SurfaceView Canvas
  insertYourBigImageDrawingFunctionHere(surfaceCanvas);
  //Now draw your circles at their correct positions...
  insertCircleDrawingFunctionHere(surfaceCanvas);
}

现在您可以访问SurfaceView Canvas,您可以精确选择绘制内容的方式。像圈子一样......

我想提请你注意多个Canvas'在下面使用(surfaceCanvas与circleCanvas)。我曾经认为Canvas是一款适合整个应用程序/活动的Canvas。实施,但它不是。您可以自由创建Canvas'如你所愿。它只是一个绘制到Bitmaps上的工具的实例。这对我来说是一个巨大的启示,并且让我更加强大地控制了位图的组合方式。

public void myCircleDrawingFunction(Canvas surfaceCanvas){
  //Make a new Bitmap for your circle
  Bitmap.Config conf = Bitmap.Config.ARGB_4444;
  tinyCircleBMP = Bitmap.createBitmap(10,10, conf);
  //Make a new canvas using that Bitmap as the source...
  Canvas circleCanvas = new Canvas(cacheBmp);
  //Now, perform your drawing on the `Canvas`...
  Paint p = new Paint();
  circleCanvas.drawCircle(5, 5, 5, p);
  //Now the `Bitmap` has a circle on it, draw the `Bitmap` on the `SufaceView Canvas`
  surfaceCanvas.drawBitmap(tinyCircleBMP, 10, 10, p);
  //Replace the '10's in the above function with relevant coordinates.
}

现在很明显,你的圈子会以不同的方式缩放/平移你的“大”。因为它们不再以“大”的相同大小/位置绘制。图片。您需要考虑如何转换每个圆圈的位置,同时考虑到“大”的当前比例和位置。图像。

例如,如果您的图像放大到200%,并且圆圈应该从大图像的左侧出现100px,那么您应该将像素值相乘以考虑缩放,就像这样

(伪码): drawCircleAtX = Bitmap.left * BitmapZoomFactor

答案 1 :(得分:0)

如果您正在使用canvas API(如果不是我建议的话)?如果是这样,你只需在画布上绘制图像,然后在显示之前在同一画布上绘制原始形状。这样,您只需在一些基本数据类型中保留圆圈位置的参考,并在用户移动和缩放时缩放它们,这样您就知道每帧的绘制位置。