1.drawable
这是我们最熟悉的,drawable有一个很重要的点是会根据手机的分辨率自动的缩放图片。这可能也是被叫做drawable的原因。如果我们完全不希望我们的图片会被压缩,我们可以考虑放在assert或者raw目录下。
2.assets
很重要的一点是assets和res是同级的,而不是和res/drawable同级。在res下面的文件才会被R类引用。
assert不会被R.java文件读取。也就是我们不能通过R.assets.xxx这样的方式获取下面的资源。通过系统提供的AssetManager可以执行加载文件的操作,读取图片的方式如下,读取其它文件也是类似的。
Bitmap bgImg = getImageFromAssetFile( "background.png" );
/**
* 从assets中读取图片
*/
private Bitmap getImageFromAssetsFile(String fileName)
{
Bitmap image = null;
AssetManager am = getResources().getAssets();
try
{
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return image;
}
还有一个很重要的点是assert是可以创建子目录的,这样方便文件管理,而不像drawable那样所有文件都放在同一个目录下。
还有一点,assert目录下的文件不会像drawable目录那样图片因为分辨率的原因会被压缩放大。
3.raw
raw的意思就是原生的,体现在他不会因为手机分辨率的不同而压缩。例如下面获取raw目录图片的代码
InputStream inputStream = getResources().openRawResource(R.raw.img);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
BitmapFactory.decodeStream获取的宽高和原图是一样的,而如果是通过BitmapFactory.decodeResource(getResources(), R.drawable.img);这样的方式的话,获取到的宽高可能因为分辨率的关系而放大缩小(看你的资源图片是否正好放在你手机那个分辨率的对应drawable目录)。
总结:
assets | raw | drawable | |
---|---|---|---|
位置 | /assets | /res/raw | /res/drawable |
是否受分辨率影响 | 否 | 否 | 是 |
能不能有子目录 | 能 | 不能 | 不能 |