自定义图片选择器

xiaoxiao2021-02-28  42

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>
转载请注明原文地址: https://www.6miu.com/read-2613524.html

最新回复(0)