TestActivity
public class TestImageActivity extends BaseSkinActivity{
private ArrayList<String> mImageList;
private final int SELECT_IMAGE_REQUEST = 0x0011;
@Override
protected void initData() {
}
@Override
protected void initView() {
}
@Override
protected void initTitle() {
}
@Override
protected void setContentView() {
setContentView(R.layout.activity_test_image);
}
// 选择图片
public void selectImage(View view){
/*Intent intent = new Intent(this,SelectImageActivity.class);
intent.putExtra(SelectImageActivity.EXTRA_SELECT_COUNT,9);
intent.putExtra(SelectImageActivity.EXTRA_SELECT_MODE,SelectImageActivity.MODE_MULTI);
intent.putStringArrayListExtra(SelectImageActivity.EXTRA_DEFAULT_SELECTED_LIST, mImageList);
intent.putExtra(SelectImageActivity.EXTRA_SHOW_CAMERA, true);
startActivityForResult(intent,SELECT_IMAGE_REQUEST);*/
ImageSelector.create().count(9).muilti()
.origin(mImageList).showCamera(true)
.start(this,SELECT_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
if(requestCode == SELECT_IMAGE_REQUEST && data != null){
mImageList = data.getStringArrayListExtra(SelectImageActivity.EXTRA_RESULT);
// 做一下显示
Log.e("TAG",mImageList.toString());
}
}
}
}
SelectImageActivity
public class SelectImageActivity extends BaseSkinActivity implements View.OnClickListener {
// 带过来的Key
// 是否显示相机的EXTRA_KEY
public static final String EXTRA_SHOW_CAMERA = "EXTRA_SHOW_CAMERA";
// 总共可以选择多少张图片的EXTRA_KEY
public static final String EXTRA_SELECT_COUNT = "EXTRA_SELECT_COUNT";
// 原始的图片路径的EXTRA_KEY
public static final String EXTRA_DEFAULT_SELECTED_LIST = "EXTRA_DEFAULT_SELECTED_LIST";
// 选择模式的EXTRA_KEY
public static final String EXTRA_SELECT_MODE = "EXTRA_SELECT_MODE";
// 返回选择图片列表的EXTRA_KEY
public static final String EXTRA_RESULT = "EXTRA_RESULT";
// 加载所有的数据
private static final int LOADER_TYPE = 0x0021;
/*****************
* 获取传递过来的参数
*****************/
// 选择图片的模式 - 多选
public static final int MODE_MULTI = 0x0011;
// 选择图片的模式 - 单选
public static int MODE_SINGLE = 0x0012;
// 单选或者多选,int类型的type
private int mMode = MODE_MULTI;
// int 类型的图片张数
private int mMaxCount = 8;
// boolean 类型的是否显示拍照按钮
private boolean mShowCamera = true;
// ArraryList<String> 已经选择好的图片
private ArrayList<String> mResultList;
@ViewById(R.id.image_list_rv)
private RecyclerView mImageListRv;
@ViewById(R.id.select_preview)
private TextView mSelectPreview;
@ViewById(R.id.select_num)
private TextView mSelectNum;
@ViewById(R.id.select_finish)
private TextView mSelectFinish;
@Override
protected void initData() {
// 1.获取传递过来的参数
Intent intent = getIntent();
mMode = intent.getIntExtra(EXTRA_SELECT_MODE, mMode);
mMaxCount = intent.getIntExtra(EXTRA_SELECT_COUNT, mMaxCount);
mShowCamera = intent.getBooleanExtra(EXTRA_SHOW_CAMERA, mShowCamera);
mResultList = intent.getStringArrayListExtra(EXTRA_DEFAULT_SELECTED_LIST);
if (mResultList == null) {
mResultList = new ArrayList<>();
}
// 2.初始化本地图片数据
initImageList();
// 3.改变显示
exchangeViewShow();
}
private void exchangeViewShow() {
if (mResultList.size() > 0) {
mSelectPreview.setEnabled(true);
mSelectPreview.setOnClickListener(this);
} else {
mSelectPreview.setEnabled(false);
mSelectPreview.setOnClickListener(null);
}
mSelectNum.setText(mResultList.size() + "/" + mMaxCount);
}
/**
* 2.ContentProvider获取内存卡中所有的图片
*/
private void initImageList() {
// 耗时操作,开线程,AsyncTask,
// int id 查询全部
getLoaderManager().initLoader(LOADER_TYPE, null, mLoaderCallback);
}
private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback =
new LoaderManager.LoaderCallbacks<Cursor>() {
public final String[] IMAGE_PROJECTION = {
MediaStore.Images.Media.DATA,//路径
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media.MIME_TYPE,
MediaStore.Images.Media.SIZE,
MediaStore.Images.Media._ID
};
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// 查询数据库一样 语句
CursorLoader cursorLoader = new CursorLoader(SelectImageActivity.this,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
IMAGE_PROJECTION[4] + ">0 AND " + IMAGE_PROJECTION[3] + "=? OR "
+ IMAGE_PROJECTION[3] + "=? ",
new String[]{"image/jpeg", "image/png"}, IMAGE_PROJECTION[2] + " DESC");
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// 解析,封装到集合 只保存String路径
if (data != null && data.getCount() > 0) {
ArrayList<String> images = new ArrayList<>();
if (mShowCamera) {
images.add("");
}
//不断遍历循环
while (data.moveToNext()) {
// 只保存路径
String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));
images.add(path);
}
// 显示列表数据
showImageList(images);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
};
/**
* 3.展示获取到的图片显示到列表
*/
private void showImageList(ArrayList<String> images) {
SelectImageListAdapter adapter = new SelectImageListAdapter(this, images, mResultList, mMaxCount);
mImageListRv.setLayoutManager(new GridLayoutManager(this, 4));
adapter.setSelectImageListener(new SelectImageListener() {
@Override
public void select() {
exchangeViewShow();
}
});
mImageListRv.setAdapter(adapter);
}
@Override
protected void initView() {
}
@OnClick(R.id.select_finish)
public void selectFinish(){
Intent intent=new Intent();
intent.putStringArrayListExtra(EXTRA_RESULT,mResultList);
setResult(RESULT_OK,intent);
finish();
}
@Override
protected void initTitle() {
new DefaultNavigationBar.Builder(this)
.setTitle("所有图片")
.builder();
//设置状态栏
StatusBarUtil.statusBarTintColor(this, Color.parseColor("#261f1f"));
}
@Override
protected void setContentView() {
setContentView(R.layout.activity_image_selector);
}
@Override
public void onClick(View v) {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 1.第一个要把图片加到集合
// 2.调用sureSelect()方法
// 3.通知系统本地有图片改变,下次进来可以找到这张图片
// notify system the image has change
// sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(mTempFile));
}
}
ImageSelector
public class ImageSelector {
// 最多可以选择多少张图片 - 默认8张
private int mMaxCount = 9;
// 选择图片的模式 - 默认多选
private int mMode = SelectImageActivity.MODE_MULTI;
// 是否显示拍照的相机
private boolean mShowCamera = true;
// 原始的图片
private ArrayList<String> mOriginData;
private ImageSelector() {
}
public static ImageSelector create() {
return new ImageSelector();
}
/**
* 单选模式
*/
public ImageSelector single() {
mMode = SelectImageActivity.MODE_SINGLE;
return this;
}
/**
* 多选模式
*/
public ImageSelector muilti() {
mMode = SelectImageActivity.MODE_MULTI;
return this;
}
/**
* 设置可以选多少张
*/
public ImageSelector count(int maxCount) {
this.mMaxCount = maxCount;
return this;
}
/**
* 是否显示相机
*/
public ImageSelector showCamera(boolean showCamera) {
this.mShowCamera = showCamera;
return this;
}
/**
* 原来选择好的图片
*/
public ImageSelector origin(ArrayList<String> originList){
this.mOriginData=originList;
return this;
}
/**
* 启动执行 权限6.0自己需要去申请,也可以用我的权限申请框架
*/
public void start(Activity activity, int requestCode) {
Intent intent = new Intent(activity, SelectImageActivity.class);
addParamsByIntent(intent);
activity.startActivityForResult(intent, requestCode);
}
/**
* 给Intent添加参数
*
* @param intent
*/
private void addParamsByIntent(Intent intent) {
intent.putExtra(SelectImageActivity.EXTRA_SHOW_CAMERA, mShowCamera);
intent.putExtra(SelectImageActivity.EXTRA_SELECT_COUNT, mMaxCount);
if (mOriginData != null && mMode == SelectImageActivity.MODE_MULTI) {
intent.putStringArrayListExtra(SelectImageActivity.EXTRA_DEFAULT_SELECTED_LIST, mOriginData);
}
intent.putExtra(SelectImageActivity.EXTRA_SELECT_MODE, mMode);
}
}
SelectImageListAdapter
public class SelectImageListAdapter extends CommonRecyclerAdapter<String> {
private ArrayList<String> mImages;
private int mMaxCount;
public SelectImageListAdapter(Context context, List<String> data, ArrayList<String> images, int maxCount) {
super(context, data, R.layout.media_chooser_item);
this.mImages = images;
this.mMaxCount=maxCount;
}
@Override
public void convert(ViewHolder holder, final String item) {
if (TextUtils.isEmpty(item)) {
// 显示拍照
holder.setViewVisibility(R.id.camera_ll, View.VISIBLE);
holder.setViewVisibility(R.id.media_selected_indicator, View.INVISIBLE);
holder.setViewVisibility(R.id.image, View.INVISIBLE);
holder.setOnIntemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 调用拍照,权限很重要,6.0以上要处理
// http://www.jianshu.com/p/823360bb183f
}
});
} else {
// 显示图片
holder.setViewVisibility(R.id.camera_ll, View.INVISIBLE);
holder.setViewVisibility(R.id.media_selected_indicator, View.VISIBLE);
holder.setViewVisibility(R.id.image, View.VISIBLE);
// 显示图片利用Glide
ImageView imageView = holder.getView(R.id.image);
ImageView media_selected_indicator = holder.getView(R.id.media_selected_indicator);
if (mImages.contains(item)) {
media_selected_indicator.setSelected(true);
} else {
media_selected_indicator.setSelected(false);
}
Glide.with(mContext).load(item).centerCrop().into(imageView);
holder.setOnIntemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mImages.contains(item)) {
if(mImages.size()>=mMaxCount){
Toast.makeText(mContext, "最多选择"+mMaxCount+"张", Toast.LENGTH_SHORT).show();
return;
}
mImages.add(item);
} else {
mImages.remove(item);
}
if(mSelectImageListener!=null){
mSelectImageListener.select();
}
notifyDataSetChanged();
}
});
}
}
private SelectImageListener mSelectImageListener;
public void setSelectImageListener(SelectImageListener mSelectImageListener) {
this.mSelectImageListener = mSelectImageListener;
}
}
SelectImageListener
public interface SelectImageListener {
void select();
}
状态栏工具类StatusBarUtil
public class StatusBarUtil {
/**
* 设置状态栏的颜色
*/
@TargetApi(19)
public static void statusBarTintColor(Activity activity, int color) {
// 代表 5.0 及以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().setStatusBarColor(color);
return;
}
// versionCode > 4.4 and versionCode < 5.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup androidContainer = (ViewGroup) activity.findViewById(android.R.id.content);
// 留出高度 setFitsSystemWindows true代表会调整布局,会把状态栏的高度留出来
View contentView = androidContainer.getChildAt(0);
if (contentView != null) {
contentView.setFitsSystemWindows(true);
}
// 在原来的位置上添加一个状态栏
View statusBarView = createStatusBarView(activity);
androidContainer.addView(statusBarView, 0);
statusBarView.setBackgroundColor(color);
}
}
/**
* 创建一个需要填充statusBarView
*/
private static View createStatusBarView(Activity activity) {
View statusBarView = new View(activity);
ViewGroup.LayoutParams statusBarParams = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(statusBarParams);
return statusBarView;
}
/**
* 获取状态栏的高度
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 状态栏透明,整个界面全屏
*/
public static void statusBarTranslucent(Activity activity) {
// 代表 5.0 及以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = activity.getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
decorView.setSystemUiVisibility(option);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
return;
}
// versionCode > 4.4 and versionCode < 5.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
SquareFrameLayout
public class SquareFrameLayout extends FrameLayout {
public SquareFrameLayout(Context context) {
super(context);
}
public SquareFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width=MeasureSpec.getSize(widthMeasureSpec);
int height=width;
setMeasuredDimension(width,height);
}
}
SquareImageView
public class SquareImageView extends ImageView {
public SquareImageView(Context context) {
super(context);
}
public SquareImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width=MeasureSpec.getSize(widthMeasureSpec);
int height=width;
setMeasuredDimension(width,height);
}
}
media_chooser_item
<?xml version="1.0" encoding="utf-8"?>
<com.hbwj.essayjoke.selectImage.view.SquareFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hbwj.essayjoke.selectImage.view.SquareImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerInside" />
<View
android:id="@+id/mask"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#88000000"
android:visibility="gone" />
<ImageView
android:id="@+id/media_selected_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:padding="5.0dip"
android:src="@drawable/media_chooser_ic" />
<LinearLayout
android:id="@+id/camera_ll"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:src="@drawable/ic_media_chooser_take_picture"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center_horizontal"
android:text="拍照"
android:textColor="#CDCECE"
android:textSize="14sp" />
</LinearLayout>
</com.hbwj.essayjoke.selectImage.view.SquareFrameLayout>
activity_test_ImageView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/image_list_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:onClick="selectImage"
android:text="选择"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>