关于Android Bitmap.setDensity 和BitmapDrawable.setTargetDensity() 的作用:


   Bitmap.setDensity:

api文档时这样解释的:Specifies the density for this bitmap.  When the bitmap is drawn to a Canvas that also has a density, it will be scaled  appropriately.

也就是说如果我们从本地sdcard 或者网络等地方获取到一个bitmap的时候,可以对其进行进行设置density 好让在draw bitmap的时候进行适当的缩放,如果不进行设置,默认是设备的Density,如果使用默认的density,那么当把一个bitmap显示到一个ImageView上的时候就不会对其进行缩放。

说到此处那么就得简单的说一下android 对res 目录下的图片资源自动缩放的机制,比如一张图片位于res/drawable-hdpi (DENSITY_HIGH = 240)中,而手机的density 对应的是DENSITY_XHIGH = 320,那么当显示这个图片的时候就会进行放大(320/240)倍,现在应该明白了上面所说的为什        么如果不设置bitmap的density就不会对bitmap进行自动缩放,因为默认density就是设备的density两个相等,相反如果认为手动的进行设置一个和设备density不相等的值,那么就会缩放(设备density /你设置的density )倍。

这个api 一般在情况下使用呢?举个简单的例子,在开发一个app的时候,UI 切图的时候都会基于某个分辨率来切图(也就是对应某个density),如果有多套图,不同分辨率的放到不同资源目录下,如果有些情况需要把图片放到Assets 目录下,或者是动态的从网络中获取,怎么才能让图片更具分辨率或(density)自动缩放呢?那么 Bitmap.setDensity 就派上用场了


BitmapDrawable.setTargetDensity:

api 文档时这样解释的:Set the density scale at which this drawable will be rendered.

也就是说设置一个density,drawable对象将会以设置的这个density进行渲染,默认值为设备的Density ,是什么意思呢?

简单的来说,当我们创建一个BitmapDrawable 对象的时候,观察源码发现不管用那个一构造函数最终需要都是一个bitmap对象,btimap对象有一个density,BitmapDrawable 也有一个density 如果两个相等,那么就不会进行缩放,如果不相等就缩放(BitmapDrawable 的density / Bitmap 的density )倍,举个简单的例子:

如果设备的Density = 320,当我们从本地或者其他地方获取到一个bitmap对象的时候,在通过获取的bitmap对象构建一个BitmapDrawable 对象,如果都采用默认的Density,那么bitmap不进行缩放,保持原来大小,如果我们设置bitmap的density为160,设置BitmapDrawable 的density 为480

那么图片将放大 (480/ 160)= 3 倍



Caution : 以上两个属性在某些情况下将会被忽略,如果把bitmap 或者bitmapDrawable 作为background 的时候,因为这个时候缩放已经没有意义了,其大小必须和view控件一样大。

所以只有用于ImageView.setImageDrawable 或者 ImageView.setImageBitmap 并且同时设置了ImgeView.etScaleType(ScaleType.CENTER)或者imgeView.etScaleType(ScaleType.Matrix)才有效果,其他ScaleType都会更具图片和view大小来进行缩放,这样就没有意义了

更多相关文章

  1. 在android中创建包含对象数组对象List 的Parcelable
  2. Android 加载图片文件 函数
  3. android解析二维数组对象key:value
  4. Android——高德地图设置中心点和缩放比例,获取两点之间距离
  5. Android图片压缩及内存缓存
  6. Android 同时播放缩放动画和位移动画 时, 位移的路径会发生偏移.

随机推荐

  1. Vue自学之路3-vue模版初探
  2. 20210104 递归
  3. 210329 CSS 媒体查询 grid布局
  4. 大数据技术完美地解决了海量数据问题,可为
  5. DolphinDB的权限管理和安全
  6. 如何开始一个数据科学项目?
  7. Java并发编程学习3-可见性和对象发布
  8. 如何预测您的用户即将流失?
  9. 国标目录查询以及订阅
  10. js引入方式、变量与常量的声明与使用方式