本文章demo下载地址assets图片读取demo下载
有时候做app需要内置一些图片给用户选择,这样就不用时刻在网络上下载图片或者另外打包图片在本地文件了,这时可以将图片资源放在assets目录下,该目录的图片会随着apk一起打包进去。
1. 新建assets文件夹
建立工程后,右键点击res目录,选择new->Folder->Assets Folder,之后会在res目录上方建立assets文件夹。然后将需要内置的图片拷贝进去。
2、获取assets文件夹的图片
获取assets图片需要用到AssetManager这个类。该类主要用来读取打包在apk里的资源文件的。
AssetManager am = context.getAssets();
String[] path = null;
try {
path = am.list(""); // ""获取所有,填入目录获取该目录下所有资源
} catch (IOException e) {
e.printStackTrace();
}
3、过滤assets文件夹里的图片
如果assets中放置有多种图片,而现在只需要特定的某一类图片该怎么办?很简单,对放进去的图片进行分类命名,然后再根据特定的规则过滤就可以了。如上图中可以看成为2类图片,一类是以ic_+英文开头的png图片,一类是ic+数字开头的jpg图片。那么可以这样过滤:
public static List<String> getAssetPicPath(Context context){
AssetManager am = context.getAssets();
String[] path = null;
try {
path = am.list(""); // ""获取所有,填入目录获取该目录下所有资源
} catch (IOException e) {
e.printStackTrace();
}
List<String> pciPaths = new ArrayList<>();
for(int i = 0; i < path.length; i++){
if (path[i].endsWith(".png") && path[i].startsWith("ic_")){ // 根据图片特征找出图片
pciPaths.add(path[i]);
}
}
return pciPaths;
}
上述代码即返回所有的以ic_开头的png图片名称。
4、显示assets图片
assets图片的显示与平时的图片不一样,它只需要图片的名称,不需要图片的具体路径也可以读取成Bitmap。
/** 根据路径获取Bitmap图片
* @param context
* @param path
* @return
*/
public static Bitmap getAssetsBitmap(Context context, String path){
AssetManager am = context.getAssets();
InputStream inputStream = null;
try {
inputStream = am.open(path);
} catch (IOException e) {
e.printStackTrace();
}
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
5、使用Glide显示图片
众所周知,Glide对于图片的显示做了很多优化,那么如果我们需要使用内置的图片做成一个网格对话框供用户选择该怎么办呢?
由于assets中图片的路径只有图片名称,Glide中并不知道传进去的图片是assets里的还是本地文件里的,因此显示assets图片需要知道assets图片的具体路径。
在Glide中显示assets中的图片需要在图片名称前加上“file:///android_asset/”。
public static final String PATH_HEAD = "file:///android_asset/";
Glide.with(mContext)
.load(FileUtil.PATH_HEAD+path)
.into(imageView);
6、内置图片过滤与选择demo效果