Android 的Bitmap密度density相关问题

Android 里面Bitmap的density特性比较难懂,现在这里探究一下。

一. 密度与缩放的关系;
缩放是对尺寸进行缩放,Bitmap的密度不会变。
使用Matrix缩放Bitmap,缩放之后的密度是不变的。
二、密度与图片内存大小的关系
缩放之后就相当于在Bitmap里面增删像素pix,所占的内存会相应的变化。
三、Bitmap密度与显示密度
创建空Bitmap的默认的density是屏幕的显示密度。
四、Bitmap与canvas密度之间的关系。
canvas有自己的密度,除了使用将Bitmap绘制到矩形内这个方法
drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)
之外,其它的drawBitmap方法缩放Bitmap到相同的密度再进行绘制。

五、BitmapFactory解析Bitmap时对密度的处理
(不太清楚,这是自己根据源码和网上说明的理解)BitmapFactory解析Bitmap时,默认进行缩放的。通过indensity,inTargetDensity 等控制缩放,让其在屏幕上现显示出合适的物理尺寸合适。
比如同样大小的屏幕,其密度不一致,就会进行缩放,然后显示出的大小就想通了;还有如果同一个图片放到mipmap或Drawable的不同目录下,缩放倍数也不相同。

/**
When this flag is set, if inDensity and inTargetDensity are not 0, 
the bitmap will be scaled to match inTargetDensity when loaded, 
rather than relying on the graphics 
system scaling it each time it is drawn to a Canvas.
*/

注释意思是:设置了 inscaled,并且 inDensity 和 inTargetDensity 不为0时,就进行缩放,这样就不必再在绘图时根据canvas的密度进行缩放了,提高了效率。
缩放的标准就是设置indensity来控制,缩放的倍数就是inTargetDensity / inDensity 。比如xxhdpi的mipmap其indensity就高。(假如inTargetDensity 是inDensity 的四倍,这时Bitmap的就放大四倍,由前面,像素数量和占用内存也会相应地增加,再将它显示到inTargetDensity 密度上的屏幕时,Bitmap的尺寸增加了四倍,但屏幕的密度也是它的四倍,这是出来Bitmap的尺寸缩小四倍,和原来的一样了。)
最后,可以设置indensity和inTargetDensity 的比例来设置获取一张缩放的Bitmap。

另外, BitmapRegionDecoder和.9patch图形不进行缩放,使用BitmapRegionDecoder进行Bitmap的部分解析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值