### 關(guān)于YImagePicker
[  ](https://bintray.com/yangpeixing/yimagepicker/androidx/2.4.1/link)
- 支持無(wú)縫切換小紅書(shū)剪裁樣式并自定義UI
- 支持微信、馬蜂窩、知乎等多個(gè)不同風(fēng)格樣式定制
- 支持圖片直接預(yù)覽和編輯預(yù)覽(排序、刪除)
- 支持單圖自定義比例剪裁
- 支持視頻、圖片、GIF圖等不同類(lèi)型混合加載
- 支持視頻圖片混合單選或多選
- 支持高清預(yù)覽超長(zhǎng)圖、超大圖,圖片放大效果勝過(guò)微信
- 小紅書(shū)剪裁樣式支持視頻預(yù)覽
- 微信樣式支持指定單一類(lèi)型選擇(圖片、視頻)
- 微信樣式支持多次選擇狀態(tài)保存
- 微信樣式支持指定某些媒體文件不可選擇
- 選擇結(jié)果直接回調(diào),拒絕配置ActivityForResult+requestCode,即調(diào)用即處理
- 輕量級(jí),aar大小不超過(guò)300K,無(wú)so庫(kù),無(wú)任何第三方依賴(lài)
- 支持androidx和support
- 永久維護(hù)
### 引入依賴(lài)
**androidx版本:**
```java
implementation 'com.ypx.yimagepicker:androidx:2.4.2'
```
**support版本:**
```java
implementation 'com.ypx.yimagepicker:support:2.4.2'
```
### 核心原理
YImagePicker與主項(xiàng)目通過(guò)presenter進(jìn)行交互與解耦,presenter采用序列化接口的方式實(shí)現(xiàn)。回調(diào)采用嵌入fragment的方式實(shí)現(xiàn),類(lèi)似于Glide或RxPermisson.原理上還是使用OnActivityResult,但無(wú)需再配置requestCode并且支持跨進(jìn)程回調(diào)。
小紅書(shū)樣式需要實(shí)現(xiàn):ICropPickerBindPresenter
微信樣式需要實(shí)現(xiàn):IMultiPickerBindPresenter
[apk體驗(yàn)地址](https://www.pgyer.com/Wfhb)
### 效果圖集
- **demo效果**

- **小紅書(shū)樣式**



- **微信樣式**



- **自定義樣式**


- **自定義比例剪裁**


### 微信圖片選擇
支持視頻、GIF、長(zhǎng)圖選擇,支持單張多比例剪裁,支持多圖預(yù)覽、編輯、以及調(diào)序,支持直接拍照。調(diào)用前請(qǐng)按照demo實(shí)現(xiàn)IMultiPickerBindPresenter 接口? ? ? ? ?
#### 單選/多選—— 支持視頻和圖片單一選擇模式
```java
//微信樣式多選,WXImgPickerPresenter為用戶(hù)自定義的微信顯示樣式,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 以及一些交互邏輯,實(shí)現(xiàn)自IMultiPickerBindPresenter接口? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePicker.withMulti(new WXImgPickerPresenter())? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setMaxCount(9)//設(shè)置最大選擇數(shù)量? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setColumnCount(4)//設(shè)置顯示列數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .showVideo(true)//設(shè)置是否加載視頻? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .showGif(true)//設(shè)置是否加載GIF? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .showCamera(true)//設(shè)置是否顯示拍照按鈕(在列表第一個(gè))? ? ? ? ?
? ? ? ? .showImage(true)//設(shè)置是否加載圖片
? ? ? ? .setMaxVideoDuration(120000)//設(shè)置視頻可選擇的最大時(shí)長(zhǎng)
? ? ? ? //設(shè)置只能選擇視頻或圖片
? ? ? ? .setSinglePickImageOrVideoType(true)
? ? ? ? //設(shè)置只能選擇一個(gè)視頻
? ? ? ? .setVideoSinglePick(true)? ? ? ? ? ? ?
? ? ? ? //設(shè)置下次選擇需要屏蔽的圖片或視頻(簡(jiǎn)單點(diǎn)就是不可重復(fù)選擇)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setShieldList(new ArrayList<String>())? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置下次選擇需要帶入的圖片和視頻(簡(jiǎn)單點(diǎn)就是記錄上次選擇的圖片,可以取消之前選擇)? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setLastImageList(new ArrayList<String>())? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //調(diào)用多選? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .pick(this, new OnImagePickCompleteListener() {? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> items) {? ?
? ? ? ? ? ? ? ? //處理回調(diào)回來(lái)的圖片信息,主線(xiàn)程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? });? ?
//Fragment調(diào)用:? ?
MultiImagePickerFragment mFragment = ImagePicker.withMultiFragment(new WXImgPickerPresenter())? ?
? ? ? ? ? ? ? ...//省略以上若干屬性
? ? ? ? ? ? ? .pickWithFragment(new OnImagePickCompleteListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> items) {
? ? ? ? ? ? ? ? ? ? ? ? //處理回調(diào)回來(lái)的圖片信息,主線(xiàn)程? ? ? ?
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
//---------外部Activity需要重寫(xiě)的方法------------? ? ? ?
@Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
public void onBackPressed() {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if (null != mFragment && mFragment.onBackPressed()) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? return;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? super.onBackPressed();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
@Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {?
? ? super.onActivityResult(requestCode, resultCode, data);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if (mFragment != null) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? mFragment.onTakePhotoResult(requestCode, resultCode);? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}? ? ? ? ?
});
```
#### 單張剪裁 —— 支持自定義剪裁比例
```java
//微信樣式多選,WXImgPickerPresenter為用戶(hù)自定義的微信顯示樣式,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 以及一些交互邏輯,實(shí)現(xiàn)自IMultiPickerBindPresenter接口? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePicker.withMulti(new WXImgPickerPresenter())? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ...//省略以上所有公共屬性? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setCropRatio(1, 1)//設(shè)置剪裁比例? 1:1? ? ? ? ? ?
? ? ? ? .cropSaveFilePath("剪裁圖片保存地址")
? ? ? ? .cropRectMinMargin(0)//設(shè)置剪裁邊框間距,單位 px? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //調(diào)用剪裁? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .crop(this, new OnImagePickCompleteListener() {? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> items) {? ?
? ? ? ? ? ? ? ? //處理回調(diào)回來(lái)的圖片信息,主線(xiàn)程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? });? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
#### 預(yù)覽 —— 支持普通預(yù)覽和編輯預(yù)覽
```java
? //預(yù)覽數(shù)據(jù)源,只接受ArrayList<String> 和ArrayList<ImageItem> 兩種泛型? ? ? ? ? ? ? ? ? ? ? ? ?
ArrayList<String> imageList = new ArrayList<>();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//默認(rèn)選擇的index? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
int currentPos = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//調(diào)用預(yù)覽? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePicker.withMulti(new WXImgPickerPresenter())? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //第二個(gè)參數(shù)為預(yù)覽圖片數(shù)組、第三個(gè)參數(shù)為默認(rèn)選中的index,第四個(gè)參數(shù)為預(yù)覽回調(diào),? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //如果第四個(gè)參數(shù)為null,則代表無(wú)需對(duì)預(yù)覽的圖片進(jìn)行編輯(調(diào)序、刪除操作),反之可以編輯預(yù)覽圖? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .preview(this, imageList, currentPos, new OnImagePickCompleteListener() {
? ? ? ? ? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> items) {? ? ? ?
? ? ? ? ? ? ? ? //處理預(yù)覽回調(diào)的數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? });? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
#### 拍照
```java
? //直接調(diào)用拍照? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePicker.withMulti(new WXImgPickerPresenter()).takePhoto(this, new OnImagePickCompleteListener() {
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public void onImagePickComplete(ArrayList<ImageItem> imageItems) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //處理拍照回調(diào)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
});? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
#### 自定義UI和presenter交互 —— 支持item自定義和文件夾列表彈入方向
```java
/**
* 作者:yangpeixing on 2018/9/26 15:57
* 功能:微信樣式圖片選擇器
*/
public class WXImgPickerPresenter implements IMultiPickerBindPresenter {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public void displayListImage(ImageView imageView, ImageItem item, int size) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? Glide.with(imageView.getContext()).load(item.path).into(imageView);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public void displayPerViewImage(ImageView imageView, String url) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? Glide.with(imageView.getContext()).load(url).into(imageView);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public PickerUiConfig getUiConfig(Context context) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? PickerUiConfig config = new PickerUiConfig();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //是否沉浸式狀態(tài)欄,狀態(tài)欄顏色將根據(jù)TopBarBackgroundColor指定,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? // 并動(dòng)態(tài)更改狀態(tài)欄圖標(biāo)顏色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setImmersionBar(true);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置主題色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setThemeColor(Color.parseColor("#09C768"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置選中和未選中時(shí)圖標(biāo)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setSelectedIconID(R.mipmap.picker_wechat_select);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setUnSelectIconID(R.mipmap.picker_wechat_unselect);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置返回圖標(biāo)以及返回圖標(biāo)顏色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setBackIconID(R.mipmap.picker_icon_back_black);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setBackIconColor(Color.BLACK);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置標(biāo)題欄背景色和對(duì)齊方式,設(shè)置標(biāo)題欄文本顏色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setTitleBarBackgroundColor(Color.parseColor("#F1F1F1"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setTitleBarGravity(Gravity.START);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setTitleColor(Color.BLACK);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置標(biāo)題欄右上角完成按鈕選中和未選中樣式,以及文字顏色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? int r = ViewSizeUtils.dp(context, 2);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setOkBtnSelectBackground(CornerUtils.cornerDrawable(Color.parseColor("#09C768"), r));? ? ? ? ?
? ? ? ? config.setOkBtnUnSelectBackground(CornerUtils.cornerDrawable(Color.parseColor("#B4ECCE"), r));? ? ? ?
? ? ? ? config.setOkBtnSelectTextColor(Color.WHITE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setOkBtnUnSelectTextColor(Color.parseColor("#50ffffff"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setOkBtnText("完成");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置選擇器背景色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setPickerBackgroundColor(Color.WHITE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置選擇器item背景色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setPickerItemBackgroundColor(Color.parseColor("#484848"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置底部欄顏色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setBottomBarBackgroundColor(Color.parseColor("#333333"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置拍照按鈕圖標(biāo)和背景色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setCameraIconID(R.mipmap.picker_ic_camera);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? config.setCameraBackgroundColor(Color.parseColor("#484848"));?
? ? ? //標(biāo)題欄模式,從標(biāo)題欄選擇相冊(cè)
? ? ? ? config.setPickStyle(PickerUiConfig.PICK_STYLE_TITLE);
? ? ? ? //設(shè)置選擇器自定義item樣式
? ? ? ? config.setPickerItemView(new CustomPickerItem(context));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? return config;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public void tip(Context context, String msg) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? public void imageItemClick(Context context, ImageItem imageItem, ArrayList<ImageItem> selectImageList,? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ArrayList<ImageItem> allSetImageList, MultiGridAdapter adapter) {? ? ? ? ? ? ?
? ? ? ? tip(context, "我是自定義的圖片點(diǎn)擊事件");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
### 小紅書(shū)圖片剪裁選擇? ? ?
高仿小紅書(shū)圖片剪裁框架,支持視頻以及多圖剪裁、支持fragment樣式侵入
#### Activity直接調(diào)用
```java
//調(diào)用小紅書(shū)剪裁回調(diào)的imageItems里,imageItem.path是原圖,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// imageItem.getCropUrl()才是剪裁后的圖片? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePicker.withCrop(new RedBookCropPresenter())? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置第一張圖信息,可為null,設(shè)置以后,選擇器會(huì)默認(rèn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? // 以第一張圖片的剪裁方式剪裁后面所有的圖片? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setFirstImageItem(new ImageItem())? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setFirstImageUrl("這里填入外部已經(jīng)選擇的第一張圖片地址url")? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置要選擇的最大數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setMaxCount(count)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置是否加載視頻? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .showVideo(true)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置第一個(gè)item是否拍照? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .showCamera(true)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? //設(shè)置剪裁完圖片保存路徑? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .setCropPicSaveFilePath("圖片保存路徑")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .pick(this, new OnImagePickCompleteListener() {? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? @Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> imageItems) {
? ? ? ? ? ? ? ? //調(diào)用小紅書(shū)剪裁回調(diào)的imageItems里,imageItem.path是原圖,? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? // imageItem.getCropUrl()才是剪裁后的圖片? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? //TODO剪裁回調(diào)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? });? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
#### Fragment嵌套調(diào)用
```java
//調(diào)用小紅書(shū)剪裁回調(diào)的imageItems里,imageItem.path是原圖,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// imageItem.getCropUrl()才是剪裁后的圖片? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ImagePickAndCropFragment fragment = ImagePicker.withCropFragment(new RedBookCropPresenter())? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? //...省略以上屬性? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? .pickWithFragment(new OnImagePickCompleteListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onImagePickComplete(ArrayList<ImageItem> items) {
? ? ? ? ? ? ? ? ? ? ? ? //TODO 圖片剪裁完回調(diào) 主線(xiàn)程
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });? ?
//---------外部Activity需要重寫(xiě)的方法------------? ? ? ?
@Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
public void onBackPressed() {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if (null != mFragment && mFragment.onBackPressed()) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? return;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? super.onBackPressed();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
@Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {?
? ? super.onActivityResult(requestCode, resultCode, data);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if (mFragment != null) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? mFragment.onTakePhotoResult(requestCode, resultCode);? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
```
#### 自定義UI和Presenter交互
```java
/**
- Description: 小紅書(shū)樣式框架數(shù)據(jù)綁定
- <p>
- Author: peixing.yang
- Date: 2019/2/21
*/
public class RedBookCropPresenter implements ICropPickerBindPresenter {
? ? @Override
? ? public void displayListImage(ImageView imageView, ImageItem item, int size) {
? ? ? ? Glide.with(imageView.getContext()).load(item.path).into(imageView);
? ? }
? ? /**
? ? * 加載剪裁區(qū)域里的圖片
? ? *
? ? * @param imageView imageView
? ? * @param item? ? ? 當(dāng)前圖片信息
? ? */
? ? @Override
? ? public void displayCropImage(ImageView imageView, ImageItem item) {
? ? ? ? Glide.with(imageView.getContext()).load(item.path)
? ? ? ? ? ? ? ? .apply(new RequestOptions().format(DecodeFormat.PREFER_ARGB_8888))
? ? ? ? ? ? ? ? .into(imageView);
? ? }
? ? @Override
? ? public CropUiConfig getUiConfig(Context context) {
? ? ? ? CropUiConfig config = new CropUiConfig();
? ? ? ? //設(shè)置主題色,包含選中樣式的圓形背景色和邊框色
? ? ? ? config.setThemeColor(Color.RED);
? ? ? ? //設(shè)置item未選中圖標(biāo)
? ? ? ? config.setUnSelectIconID(R.mipmap.picker_icon_unselect);
? ? ? ? //設(shè)置相機(jī)圖標(biāo)
? ? ? ? config.setCameraIconID(R.mipmap.picker_ic_camera);
? ? ? ? //設(shè)置返回圖標(biāo)
? ? ? ? config.setBackIconID(R.mipmap.picker_icon_close_black);
? ? ? ? //設(shè)置剪裁區(qū)域自適應(yīng)圖標(biāo)
? ? ? ? config.setFitIconID(R.mipmap.picker_icon_fit);
? ? ? ? //設(shè)置剪裁區(qū)域充滿(mǎn)圖標(biāo)
? ? ? ? config.setFullIconID(R.mipmap.picker_icon_full);
? ? ? ? //設(shè)置留白圖標(biāo)
? ? ? ? config.setGapIconID(R.mipmap.picker_icon_haswhite);
? ? ? ? //設(shè)置填充圖標(biāo)
? ? ? ? config.setFillIconID(R.mipmap.picker_icon_fill);
? ? ? ? //設(shè)置視頻暫停圖標(biāo)
? ? ? ? config.setVideoPauseIconID(R.mipmap.video_play_small);
? ? ? ? //設(shè)置返回按鈕顏色
? ? ? ? config.setBackIconColor(Color.WHITE);
? ? ? ? //設(shè)置剪裁區(qū)域顏色
? ? ? ? config.setCropViewBackgroundColor(Color.parseColor("#111111"));
? ? ? ? //設(shè)置拍照?qǐng)D標(biāo)背景色
? ? ? ? config.setCameraBackgroundColor(Color.BLACK);
? ? ? ? //設(shè)置標(biāo)題欄背景色
? ? ? ? config.setTitleBarBackgroundColor(Color.BLACK);
? ? ? ? //設(shè)置下一步按鈕選中文字顏色
? ? ? ? config.setNextBtnSelectedTextColor(Color.WHITE);
? ? ? ? //設(shè)置下一步按鈕未選中文字顏色
? ? ? ? config.setNextBtnUnSelectTextColor(Color.WHITE);
? ? ? ? //設(shè)置標(biāo)題文字顏色
? ? ? ? config.setTitleTextColor(Color.WHITE);
? ? ? ? //設(shè)置item列表背景色
? ? ? ? config.setGridBackgroundColor(Color.BLACK);
? ? ? ? //設(shè)置下一步按鈕未選中時(shí)背景drawable
? ? ? ? config.setNextBtnUnSelectBackground(PCornerUtils.cornerDrawable(Color.parseColor("#B0B0B0"), PViewSizeUtils.dp(context, 30)));
? ? ? ? //設(shè)置下一步按鈕選中時(shí)背景drawable
? ? ? ? config.setNextBtnSelectedBackground(PCornerUtils.cornerDrawable(Color.RED, PViewSizeUtils.dp(context, 30)));
? ? ? ? //設(shè)置是否顯示下一步數(shù)量提示
? ? ? ? config.setShowNextCount(false);
? ? ? ? //設(shè)置下一步按鈕文字
? ? ? ? config.setNextBtnText("下一步");
? ? ? ? return config;
? ? }
? ? /**
? ? * 選擇超過(guò)數(shù)量限制提示
? ? *
? ? * @param context? ? 上下文
? ? * @param maxCount? 最大數(shù)量
? ? * @param defaultTip 默認(rèn)提示文本 “最多選擇maxCount張圖片”
? ? */
? ? @Override
? ? public void overMaxCountTip(Context context, int maxCount, String defaultTip) {
? ? ? ? if (context == null) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? AlertDialog.Builder builder = new AlertDialog.Builder(context);
? ? ? ? builder.setMessage(defaultTip);
? ? ? ? builder.setPositiveButton(com.ypx.imagepicker.R.string.picker_str_isee,
? ? ? ? ? ? ? ? new DialogInterface.OnClickListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onClick(DialogInterface dialogInterface, int i) {
? ? ? ? ? ? ? ? ? ? ? ? dialogInterface.dismiss();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
? ? ? ? AlertDialog dialog = builder.create();
? ? ? ? dialog.show();
? ? }
? ? /**
? ? * 在單選視頻里,點(diǎn)擊視頻item會(huì)觸發(fā)此回調(diào)
? ? *
? ? * @param activity? 頁(yè)面
? ? * @param imageItem 當(dāng)前選中視頻
? ? */
? ? @Override
? ? public void clickVideo(Activity activity, ImageItem imageItem) {
? ? ? ? Toast.makeText(activity, imageItem.path, Toast.LENGTH_SHORT).show();
? ? }
}
```
### 下個(gè)版本排期
時(shí)間:2019年12月左右
1. 視頻預(yù)覽框架切換(吐槽:官方videoView太難用了~~/(ㄒoㄒ)/~~)
2. 圖片剪裁支持旋轉(zhuǎn)
3. 支持JPEG、PNG、GIF、BMP、WEBP、MPEG、MP4、QUICKTIME、THREEGPP、THREEGPP2、MKV、WEBM、TS、AVI等圖片視頻文件格式混合加載或指定加載
本庫(kù)來(lái)源于mars App,想要體驗(yàn)城市最新的吃喝玩樂(lè),歡迎讀者下載體驗(yàn)mars!
作者:[calorYang](https://blog.csdn.net/qq_16674697)
郵箱:313930500@qq.com
Q Q: 313930500
微信:calor0616
**遇到問(wèn)題別繞路,QQ微信直接呼~(yú) 您的star就是我前進(jìn)的動(dòng)力~??**