小紅書(shū)圖片剪裁框架+微信圖片選擇器+超高清大圖預(yù)覽+自定義比例剪裁,支持UI自定義、支持跨進(jìn)程回調(diào)

### 關(guān)于YImagePicker

[ ![Download](https://api.bintray.com/packages/yangpeixing/yimagepicker/androidx/images/download.svg?version=2.4.1) ](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效果**

![demo效果](https://app-screenshot.pgyer.com/image/view/app_screenshots/3957d904273e547143955ca993bbf7ae-528)

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

![小紅書(shū)樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/fc09bb8d2ac27b91820593430469cc17-528)

![小紅書(shū)樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/87b43cb9ef8f40377bc3910b3ad3737b-528)

![小紅書(shū)樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/daf41cb9f9a54c3c9879555ddf4ec8c8-528)

- **微信樣式**

![微信樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/fad19096a28cec65094f6120c154b47f-528)

![微信樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/21145d344498c57954704bde3e0e7dfc-528)

![微信樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/2cb198df6739d1a9f91d9ee60ec3c29f-528)

- **自定義樣式**

![自定義樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/44b8fdecff62aa20eb51b4f54cfec30a-528)

![自定義樣式](https://app-screenshot.pgyer.com/image/view/app_screenshots/57a62bcc84844400878fdb343cf762e8-528)

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

![自定義比例剪裁](https://app-screenshot.pgyer.com/image/view/app_screenshots/15483adb087360ff49e831cb988adce1-528)

![自定義比例剪裁](https://app-screenshot.pgyer.com/image/view/app_screenshots/c32921bd346904cec77b7fea919afb56-528)

### 微信圖片選擇

支持視頻、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)力~??**

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容