我在app上工作,在imageview中显示大的(大约2000x2000px)位图。这个图像必须很大,因为用户可以捏缩放它以查看一些细节。应用程序必须能够在该图像上绘制圆圈,并且还可以单独显示图像,而不显示圆圈。我正在使用2层,但问题是内存,因为2k x 2k px大约是16mb的内存,而创建另一个位图(另外16mb),只是为了绘制几个圆圈,在我看来毫无意义。有没有办法,你可以在图像上绘制简单的图元,并且能够在没有图元的情况下显示它(在我的例子中是圆圈)? 也许某种程度上只存储修改过的像素或某事? 谢谢!
答案 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(如果不是我建议的话)?如果是这样,你只需在画布上绘制图像,然后在显示之前在同一画布上绘制原始形状。这样,您只需在一些基本数据类型中保留圆圈位置的参考,并在用户移动和缩放时缩放它们,这样您就知道每帧的绘制位置。