Android 应用程序开发中总会遇到从本地选择照片的操作,本文描述得是一个简单得图片选择器
支持设置图片张数、可以设置屏蔽得图片格式、图片预览。更多的功能正在开发中,项目已放到:码云git上 我也在随时更新这个项目。下面就简单地介绍下这个内容。
效果图片
工程逻辑简述
实现原理则是,使用Android提供的媒体数据库,将图片资源的地址(存在本地的绝对地址(路径))提取出来,再使用Glide图片加载框架,将图片加载到RecyclerView列表中。
对于Glide框架和RecyclerView可以添加如下依赖(若遇到依赖版本问题就自行解决咯)
//Glide
compile 'com.github.bumptech.glide:glide:3.7.0'
//RecyclerView
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
以上便是这个工程的基本思路
获取图片地址(路径)
package com.util.photopicker.util;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import com.util.photopicker.bean.ImageBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by eric on 2017/12/3.
*/
public class ImageFinder {
public static final String NONE = "none";
public static final String TYPE_GIF = "image/gif";
public static final String TYPE_JPEG = "image/jpeg";
public static final String TYPE_jpg = "image/jpg";
public static final String TYPE_PNG = "image/png";
//第二个参数是配置需要屏蔽的图片格式
public static List<ImageBean> getImages(Context context, String typeShield){
String shield = typeShield;
List<ImageBean> list = new ArrayList<>();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
String type = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE));
if (type.equals(shield)) continue;
list.add(0,new ImageBean(path,name));
}
return list;
}
}
若是以上这个类看的头大,那我们只用知道一下这几行核心代码就OK了
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
String type = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE));
}
以上便是通过Android为我们提供的媒体数据库来查询图片的name,path,type。当然还有更多的图片属性可以获取,例如文件大小等信息,但我们这儿暂时只需要这些就够了。除此之外,还得有个Bean类来存放我们得到的单个数据,然后放在一个List里,再返回这个list;Bean类如下
package com.util.photopicker.bean;
/**
* Created by eric on 2017/12/3.
*/
public class ImageBean {
private String imagePath;
private String imageName;
private boolean isChoose = false;
public ImageBean(String path, String name){
this.imagePath = path;
this.imageName = name;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
public boolean isChoose() {
return isChoose;
}
public void setChoose(boolean choose) {
isChoose = choose;
}
}
当我们拿到了这个list之后就可以用列表的形式展示出来了,这里我采用的是RecyclerView,当然可以用其他的控件来代替,这里就自行考虑了。
RecyclerView
我都知道,RecyclerView简单易用,但是这个还是没法满足我们的需求,以下是对RecyclerView 的 adapter的一点小小的扩展。
package com.util.photopicker.component;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by eric on 2017/12/4.
*/
public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
public BaseViewHolder(View itemView) {
super(itemView);
findViewById(itemView);
}
/**
* 转发传入的OnItemChooseCallback与位置
* @param chooseCallback 点击回调
* @param position 位置
*/
public void setChooseCallback(OnItemChooseCallback chooseCallback,