当我们明白了dp、dpi、px、sp、屏幕密度这些概念时,这才是第一步。后面我们需要了解的是安卓是怎样一个机制来加载图片的,即那么drawable-hdpi等等是怎么个玩意儿。我想写一个实例来窥探其一部分特性,后续的特性会慢慢补上。
这个实验呢,很简单,一张图(590x300),开两个模拟器A和B(一个320x480,一个480x800)。
从安卓的资源系统中加载图片
先看raw文件夹,我们自己创建出来,将图片放在其中。
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.iv);
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize =1;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.header_graphic,op);
//Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/header_graphic.png", op);
System.out.println(op.outWidth+","+op.outHeight);
iv.setImageBitmap(bitmap);
A的结果为590,300,即图片的原始大小
B的结果为885,450,进行了一个1.5倍的放大
再看各种Drawable文件夹,假设将该图片放在drawable-hdpi中
A的结果为393,200,进行了1.5倍的缩小
B的结果为590*300,没有进行缩放
解释如下:
raw文件夹默认的为mdpi,他会根据设备的分辨率去动态的对图片进行一个缩放。
drawable-hdpi同理,系统认为这是一张高清图片,你的手机却是个mdpi的,那么他会进行缩放。
从网络或本地文件中加载图片
我们选择从本地SD卡中加载图片(网络同理)
A 590,300 没有变化
B 590,300 没有变化
所以,从本地或者网络加载图片没有筛选过程,直接显示原生图片的大小
我们要做的事情
从资源中加载图片,系统会帮你进行筛选,那么当从网络或者本地文件加载时,就需要我们自己进行一个缩放了。
核心就是BitmapFactory.Options这个参数。
比如,当我们从网络中加载上面的图片时,图片的分辨率是590x300,而A设备的分辨率是320x480,显然,我们要进行一个缩放,那么,我们令inSimpleSize=2
A 295,150
正是我们所需要的结果