关于图片 Drawable 的宽高

在Android项目的res目录下有一些对应不同屏幕DPI的子文件夹: Alt none 分别对应的DPI为:

为什么要分这些文件夹呢?

为了能够自动适配不同的屏幕,使他们看上去大小(基本)一致。

我们可以使用一张分辨率为500×500的图片(test.jpg)做一些测试。

测试代码片段如下:

public class MainActivity extends Activity {

	TextView tv;
	ImageView img;
	Drawable drawable;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		img = (ImageView)findViewById(R.id.img);
		tv = (TextView)findViewById(R.id.tv);
		drawable = getResources().getDrawable(R.drawable.test);
		String text = "IntrinsicHeight: " + drawable.getIntrinsicHeight() + " IntrinsicWidth: " + drawable.getIntrinsicWidth();
		tv.setText(text);
		img.setImageDrawable(drawable);
	}
}

先把test.jpg拷贝到xxhdpi下,在Nexus 5 (480DPI)下显示的IntrinsicHeight和IntrinsicWidth为500×500; 而在Nexus 7 (320DPI)下显示的IntrinsicHeight和IntrinsicWidth为333×333 。

接着我们把test.jpg换到xhdpi下,在Nexus 5(480DPI)下显示的IntrinsicHeight和IntrinsicWidth为750×750; 而在Nexus 7 (320DPI)下显示的IntrinsicHeight和IntrinsicWidth为500×500 。

为什么一张相同图片在不同的设备上显示出了不同的分辨率呢?这个不同的分辨率跟具体的设备有什么关系么?

答案是跟你设备的DPI有关。Android为了显示效果不依赖设备像素(pix),特别捣鼓出了一个设备独立像素(dp)。具体可参考Supporting Multiple Screens

所以在上面的例子中有:

Drawable的宽高 = 实际图片的宽高 * (设备的DPI / 文件夹对应的DPI)