用Android Canvas Bitmap 绘图
问题:
1 Canvas生成一个Bitmap时,这时候已经占内存了吗?还是往Bitmap上画东西的时候才分配内存?
如果占内存的话,Canvas生成一个Bitmap,最大能生成多大的Bitmap?
且如何控制所占的内存? 2 根据上面1的问题,我绘制一个内存极限最大的Bitmap,
想把这个Bitmap分区域绘制 然后输出到屏幕 如何实现???望各位高手不吝赐教 提供宝贵思路!!!!
问题:
1 Canvas生成一个Bitmap时,这时候已经占内存了吗?还是往Bitmap上画东西的时候才分配内存?
如果占内存的话,Canvas生成一个Bitmap,最大能生成多大的Bitmap?
且如何控制所占的内存? 2 根据上面1的问题,我绘制一个内存极限最大的Bitmap,
想把这个Bitmap分区域绘制 然后输出到屏幕 如何实现???望各位高手不吝赐教 提供宝贵思路!!!!
第二个问题,就是极限的问题,不存在,如果内存足够大,是可以的,但是分配的内存是是按照当时系统可以分配的内存来决定的,所以很多时候都会出现OOM错误,这个问题我也在想办法解决。
能分配多大要看当前设备剩余的内存大小,和可分配的空间大小,一般png的图片都不会超过1M,所以创建基本不会有问题2.不要打擦边球,需要多大内存就分配多大内存,绝对不要使用过大的图片,图像解码超过8M就OOM了,双缓冲是必须的,一样的图片如果反复绘制的话,不需要每次都创建bitmap,比如,有一个背景,上面绘制了10个图片,但是这个背景永远都就画这10个图片,那因为用双缓冲,所以一次创建完换成bitmap后,就把缓冲bitmap记录下来,下次判断一下这个缓冲,如果!=null,就直接绘制,不需要在创建。
第二个问题,就是极限的问题,不存在,如果内存足够大,是可以的,但是分配的内存是是按照当时系统可以分配的内存来决定的,所以很多时候都会出现OOM错误,这个问题我也在想办法解决。
就像google地图那样
加载的时候是若干个图层拼接加载的
拖拽的时候 露出来的图层区域加载 隐藏的图层部分内存释放
对于bitmap来说 怎么操作呢????
对于bitmap来说 怎么操作呢????这个就麻烦了,更容易OOM了,每次显示新的位图还要把旧的干掉...这个内存很容易不够的。
等待做过的高人了~
Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
创建一个bitmap时,width、height通常分别是手机屏幕宽、高含有的像素个数。
因为像素个数为整数,我个人认为,没必要创建超过手机宽高像素个数的二维像素数组(bitmap)。
仅供参考。
做这个不需要一张非常大的图。这没有必要。 最精简的做法你只需要一个和屏幕等大小的bitmap,然后再用户移动的过程中,重新绘制他。 绘制完后,把bitmap绘制到view上。如果想流畅一些,可以以屏幕的9倍方向为准, 类似九宫格。 当前屏幕在中间那格。在移动时,直接将其他格的内容绘制到屏幕上,然后更新格子的内容。 这类似于scrollview 的做法。那个android带有的浏览器的做法,我猜测是有多大,就绘制多大。就是说你做游戏的时候,一张地图全部绘制出来。然后屏幕就是一个视窗,在绘制时只把当前的那一块绘制到屏幕上。人物在动的时候,只重绘bitmap的一小部分。 然后再把更改过的拷贝到前台。
对bitmap的,你创建图片的时候就会有的。而你要画到屏幕的surface上,这个surface也有个canvas,它的大小就屏幕那么大, 二维拷贝一下就可以了。
如果占内存的话,Canvas生成一个Bitmap,最大能生成多大的Bitmap?
且如何控制所占的内存?
——————————————————————————
生成的时候已经占内存了,最大生成的Bitmap没有限制,只要不超过内存即可,但是游戏中不会生成很大的Bitmap,最多也就是比屏幕稍微大一些的而已。 2 根据上面1的问题,我绘制一个内存极限最大的Bitmap,
想把这个Bitmap分区域绘制 然后输出到屏幕 如何实现???——————————————————————————————————
API中有刷新部分区域的方法的,类似以前J2ME中的repaint方法 3、Bitmap上能分成若干个层 然后去绘制屏幕当前显示的这个层吗?
————————————————————————————————
一个Bitmap是没有层的概念的,多个Bitmap且上层的是背景透明的图片时有层的概念的