1.drawable加载规则
基本原则,先加载与设备相对应dpi的资源,否则先高后低,然后是drawable-nodpi,最后是drawable。
以下流程图是以设备为xxhdpi为例描述drawable的加载流程。有一点需要注意:一定会命中其中某个dpi资源文件,要不然在编码的时候就会报错。
values加载规则.png
2.drawable资源的缩放
当设备加载的资源dpi与自身不匹配时,就会对它进行缩放。
缩放系数,设备dpi/资源所在drawable文件夹的最高dpi。(drawable文件夹对应的是一个dpi范围,xxxhdpi对应480-640)。
以500x501图片为例,放在drawable-xxhdpi文件夹下(刚好匹配我手机),并且用RGB565加载,代码如下:
BitmapFactory.Options options=new BitmapFactory.Options();
options.inPreferredConfig= Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a,options);
Log.d(TAG, "bitmap height=" + bitmap.getHeight());
Log.d(TAG, "bitmap width=" + bitmap.getWidth());
加载结果如下:
xxdpi result.png
把图片放在drawable-xxxhdpi文件夹下,用同样的代码加载,加载结果如下:
xxxdpi result.png
对比发现,图片的宽跟高都缩小了,也导致图片的所占的内存变小了。
图片放在drawable-xxxhdpi文件夹,480dpi的手机加载,
缩放因子为480/640=0.75。
值得注意,drawable-nohdpi的dpi跟设备dpi一致,即图片会原样输出,drawable文件夹跟drawable-mpdi一致,都是160dpi。
3.values加载规则
values的加载分两个方向来讨论,分别是dpi跟分辨率。如果仅仅是dpi,也就是values-xxhdpi ,values-xxxhdpi等,那么加载规格跟drawable一致,如果是分辨率,那就不一样了。
分辨率加载规则,就近加载,而且只加载低不加载高。
例如手机为1920x1080,分别有values-1910x1080、values-1930x1080、values,则会先加载values-1910x1080,不成功,直接加载values,values-1930x1080不在考虑范围内。
下面我们来验证下
我手机的参数
设备.png
分配新增values-1910x1080、values-1930x1080,两者配置不同的tv_width
参数以便区分,
1910x1080.png 1930x1080.png
通过以下代码打印控件宽度
final ActivityMainBindingImpl viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.d(TAG,"tv width="+viewDataBinding.textView.getWidth());
Log.d(TAG,"tv heigh="+viewDataBinding.textView.getHeight());
}
},200);
结果如下
tv width.png
设备加载到values-1910x1080配置的参数,如果values-1910x1080没有,则加载values配置的参数。
可能有人会问,如果是values-xxhdpi-1905x1080,values-xxhdpi-1910x1080,values-xxxhdpi-1920x1080,这样该怎么加载呢?
是先考虑dpi,后考虑分辨率。1920*1080,480dpi的手机,先匹配到values-xxhdpi,紧接着匹配到values-xxhdpi-1910x1080。
以上分析有不对的地方,大家可以讨论下,互相学习哦!
网友评论