@@ -16,7 +16,10 @@ import com.luck.picture.lib.engine.PictureSelectorEngine
1616import com.luck.picture.lib.entity.LocalMedia
1717import com.luck.picture.lib.entity.LocalMedia.parseLocalMedia
1818import com.luck.picture.lib.listener.OnResultCallbackListener
19+ import com.luck.picture.lib.manager.UCropManager
1920import com.luck.picture.lib.style.PictureParameterStyle
21+ import com.yalantis.ucrop.model.AspectRatio
22+ import com.yalantis.ucrop.view.CropImageView
2023import java.io.File
2124import java.io.FileOutputStream
2225import java.io.IOException
@@ -43,18 +46,46 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
4346 private var isExportThumbnail: Boolean = false
4447 private var maxVideo: Int = 20
4548 private var isCamera: Boolean = true
49+ private var isCrop: Boolean = false
50+ private var isCropCircle: Boolean = false
4651
4752 @ReactMethod
4853 fun openPicker (options : ReadableMap ? , promise : Promise ): Unit {
4954 PictureAppMaster .getInstance().app = this
5055 val activity = currentActivity
5156 setConfiguration(options)
5257
58+ // set up configration ucrop
59+ val basicUCropConfig = UCropManager .basicOptions(appContext);
60+ basicUCropConfig.setShowCropFrame(true )
61+ basicUCropConfig.setShowCropGrid(true )
62+ basicUCropConfig.setCropDragSmoothToCenter(true )
63+ basicUCropConfig.setHideBottomControls(false )
64+ basicUCropConfig.setCircleDimmedLayer(isCropCircle)
65+ if (isCropCircle){
66+ basicUCropConfig.withAspectRatio(1F ,1F )
67+ basicUCropConfig.setShowCropFrame(false )
68+ }else {
69+ basicUCropConfig.setAspectRatioOptions(
70+ 1 ,
71+ AspectRatio (" 1:2" , 1F , 2F ),
72+ AspectRatio (" 3:4" , 3F , 4F ),
73+ // AspectRatio(
74+ // "RATIO",
75+ // CropImageView.DEFAULT_ASPECT_RATIO,
76+ // CropImageView.DEFAULT_ASPECT_RATIO
77+ // ),
78+ AspectRatio (" 16:9" , 16F , 9F ),
79+ AspectRatio (" 1:1" , 1F , 1F )
80+ )
81+ }
82+
5383 PictureSelector .create(activity)
5484 .openGallery(if (mediaType == " video" ) PictureMimeType .ofVideo() else if (mediaType == " image" ) PictureMimeType .ofImage() else PictureMimeType .ofAll())
5585 .loadImageEngine(GlideEngine .createGlideEngine())
5686 .maxSelectNum(maxSelectedAssets)
5787 .imageSpanCount(numberOfColumn)
88+ .isSingleDirectReturn(true )
5889 .isZoomAnim(true )
5990 .isPageStrategy(true , 50 )
6091 .isWithVideoImage(true )
@@ -65,20 +96,12 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
6596 .setPictureStyle(mPictureParameterStyle)
6697 .isPreviewImage(isPreview)
6798 .isPreviewVideo(isPreview)
99+ .isEnableCrop(isCrop)
100+ .basicUCropConfig(basicUCropConfig)
68101 .isCamera(isCamera)
69- .isReturnEmpty(true )
70102 .selectionMode(if (singleSelectedMode) PictureConfig .SINGLE else PictureConfig .MULTIPLE )
71103 .forResult(object : OnResultCallbackListener <LocalMedia ?> {
72104 override fun onResult (result : MutableList <LocalMedia ?>? ) {
73- // check difference
74- if (singleSelectedMode) {
75- val singleLocalMedia: WritableArray = WritableNativeArray ()
76- val media: WritableMap =
77- createAttachmentResponse(result?.get(0 ) as LocalMedia )
78- singleLocalMedia.pushMap(media)
79- promise.resolve(singleLocalMedia)
80- return
81- }
82105 val localMedia: WritableArray = WritableNativeArray ()
83106 if (result?.size == 0 ) {
84107 promise.resolve(localMedia)
@@ -90,7 +113,6 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
90113 if (result != null ) {
91114 for (i in 0 until result.size) {
92115 val item: LocalMedia = result[i] as LocalMedia
93- println (" item: $item " )
94116 val media: WritableMap = createAttachmentResponse(item)
95117 localMedia.pushMap(media)
96118 }
@@ -107,6 +129,7 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
107129 private fun setConfiguration (options : ReadableMap ? ) {
108130 if (options != null ) {
109131 handleSelectedAssets(options)
132+ val cropping = options.getBoolean(" isCrop" )
110133 singleSelectedMode = options.getBoolean(" singleSelectedMode" )
111134 maxVideoDuration = options.getInt(" maxVideoDuration" )
112135 numberOfColumn = options.getInt(" numberOfColumn" )
@@ -117,16 +140,18 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
117140 maxVideo = options.getInt(" maxVideo" )
118141 mPictureParameterStyle = getStyle(options)
119142 isCamera = options.getBoolean(" usedCameraButton" )
143+ isCropCircle = options.getBoolean(" isCropCircle" )
144+ isCrop = cropping == true && singleSelectedMode == true
120145 }
121146 }
122147
123148 private fun getStyle (options : ReadableMap ): PictureParameterStyle ? {
124149 val pictureStyle = PictureParameterStyle ()
125- pictureStyle.pictureCheckedStyle = R .drawable.picture_selector
150+ pictureStyle.pictureCheckedStyle = if (singleSelectedMode) R .drawable.checkbox_selector else R .drawable.picture_selector
126151
127152 // bottom style
128153 pictureStyle.pictureCompleteText = options.getString(" doneTitle" )
129- pictureStyle.isOpenCheckNumStyle = true
154+ pictureStyle.isOpenCheckNumStyle = if (singleSelectedMode) false else true
130155 pictureStyle.isCompleteReplaceNum = true
131156 pictureStyle.pictureCompleteTextSize = 16
132157 pictureStyle.pictureCheckNumBgStyle = R .drawable.num_oval_orange
@@ -218,6 +243,13 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
218243 media.putDouble(" size" , item.size.toDouble())
219244 media.putDouble(" bucketId" , item.bucketId.toDouble())
220245 media.putString(" parentFolderName" , item.parentFolderName)
246+ if (item.isCut){
247+ val crop = WritableNativeMap ()
248+ crop.putString(" cropPath" , item.cutPath)
249+ crop.putDouble(" width" , item.cropImageWidth.toDouble())
250+ crop.putDouble(" height" , item.cropImageHeight.toDouble())
251+ media.putMap(" crop" , crop)
252+ }
221253 if (type == = " video" && isExportThumbnail) {
222254 val thumbnail = createThumbnail(item.realPath)
223255 println (" thumbnail: $thumbnail " )
0 commit comments