├── .github
└── ISSUE_TEMPLATE.md
├── .gitignore
├── LICENSE
├── README.md
├── README_CN.md
├── app
├── .gitignore
├── build.gradle
├── demo
│ └── demo_2023-12-17_060744_v3.11.2.apk
├── libs
│ ├── arm64-v8a
│ │ ├── libijkffmpeg.so
│ │ ├── libijkplayer.so
│ │ └── libijksdl.so
│ └── armeabi
│ │ ├── libijkffmpeg.so
│ │ ├── libijkplayer.so
│ │ └── libijksdl.so
├── proguard-rules.pro
├── signature
│ └── picture.jks
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── luck
│ │ └── pictureselector
│ │ ├── App.java
│ │ ├── CoilEngine.kt
│ │ ├── CustomBottomNavBar.java
│ │ ├── CustomCompleteSelectView.java
│ │ ├── CustomLoadingDialog.java
│ │ ├── CustomPreviewAdapter.java
│ │ ├── CustomPreviewBottomNavBar.java
│ │ ├── CustomPreviewFragment.java
│ │ ├── CustomPreviewTitleBar.java
│ │ ├── CustomTitleBar.java
│ │ ├── ExoPlayerEngine.java
│ │ ├── FullyGridLayoutManager.java
│ │ ├── GlideEngine.java
│ │ ├── IjkPlayerEngine.java
│ │ ├── IjkPlayerView.java
│ │ ├── ImageCacheUtils.java
│ │ ├── ImageLoaderUtils.java
│ │ ├── ImageUtil.java
│ │ ├── InjectFragmentActivity.java
│ │ ├── LineWrapRadioGroup.java
│ │ ├── MainActivity.java
│ │ ├── OnlyQueryDataActivity.java
│ │ ├── PicassoEngine.java
│ │ ├── PictureSelectorEngineImp.java
│ │ ├── RoundedCornersTransform.java
│ │ ├── SimpleActivity.java
│ │ ├── VideoRequestHandler.java
│ │ ├── adapter
│ │ └── GridImageAdapter.java
│ │ └── listener
│ │ ├── DragListener.java
│ │ └── OnItemLongClickListener.java
│ └── res
│ ├── drawable-hdpi
│ └── ic_launcher.png
│ ├── drawable-mdpi
│ └── ic_launcher.png
│ ├── drawable-xhdpi
│ ├── ic_add_image.png
│ ├── ic_dump_delete.png
│ ├── ic_item_delete.png
│ ├── ic_launcher.png
│ ├── ic_mark_win.png
│ ├── ic_minus.png
│ ├── ic_normal_delete.png
│ ├── ic_play.png
│ └── ic_plus.png
│ ├── drawable-xxhdpi
│ ├── ic_check.png
│ ├── ic_launcher.png
│ ├── ic_orange_arrow_down.png
│ └── ps_select_check.png
│ ├── drawable-xxxhdpi
│ └── ic_launcher.png
│ ├── drawable
│ ├── ps_demo_blue_num_normal.xml
│ ├── ps_demo_blue_num_selected.xml
│ ├── ps_demo_blue_num_selector.xml
│ ├── ps_demo_custom_selector.xml
│ ├── ps_demo_only_album_bg.xml
│ ├── ps_demo_permission_desc_bg.xml
│ ├── ps_demo_preview_blue_num_selected.xml
│ ├── ps_demo_preview_blue_num_selector.xml
│ ├── ps_demo_preview_grey_oval_normal.xml
│ ├── ps_demo_transparent_bg.xml
│ └── ps_demo_white_preview_selector.xml
│ ├── layout
│ ├── activity_inject_fragment.xml
│ ├── activity_main.xml
│ ├── activity_only_query_data.xml
│ ├── activity_other.xml
│ ├── activity_simp.xml
│ ├── custom_alert_dialog.xml
│ ├── gv_filter_image.xml
│ ├── layout_number.xml
│ ├── layout_video_number.xml
│ ├── ps_custom_album_folder_item.xml
│ ├── ps_custom_bottom_nav_bar.xml
│ ├── ps_custom_complete_selected_layout.xml
│ ├── ps_custom_fragment_preview.xml
│ ├── ps_custom_fragment_selector.xml
│ ├── ps_custom_item_grid_audio.xml
│ ├── ps_custom_item_grid_image.xml
│ ├── ps_custom_item_grid_video.xml
│ ├── ps_custom_preview_gallery_item.xml
│ ├── ps_custom_preview_image.xml
│ ├── ps_custom_preview_video.xml
│ └── ps_custom_title_bar.xml
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── camerax
├── .gitignore
├── build.gradle
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── luck
│ │ └── lib
│ │ └── camerax
│ │ ├── CameraImageEngine.java
│ │ ├── CustomCameraConfig.java
│ │ ├── CustomCameraView.java
│ │ ├── PictureCameraActivity.java
│ │ ├── SimpleCameraX.java
│ │ ├── listener
│ │ ├── CameraListener.java
│ │ ├── CameraXOrientationEventListener.java
│ │ ├── CameraXPreviewViewTouchListener.java
│ │ ├── CaptureListener.java
│ │ ├── ClickListener.java
│ │ ├── IObtainCameraView.java
│ │ ├── ImageCallbackListener.java
│ │ ├── OnSimpleXPermissionDeniedListener.java
│ │ ├── OnSimpleXPermissionDescriptionListener.java
│ │ └── TypeListener.java
│ │ ├── permissions
│ │ ├── PermissionChecker.java
│ │ ├── PermissionResultCallback.java
│ │ └── SimpleXPermissionUtil.java
│ │ ├── utils
│ │ ├── BitmapUtils.java
│ │ ├── CameraUtils.java
│ │ ├── DateUtils.java
│ │ ├── DensityUtil.java
│ │ ├── DoubleUtils.java
│ │ ├── FileUtils.java
│ │ └── SimpleXSpUtils.java
│ │ └── widget
│ │ ├── CaptureButton.java
│ │ ├── CaptureLayout.java
│ │ ├── FocusImageView.java
│ │ ├── ReturnButton.java
│ │ └── TypeButton.java
│ └── res
│ ├── anim
│ └── focusview_show.xml
│ ├── drawable-xxhdpi
│ ├── focus_failed.9.png
│ ├── focus_focused.9.png
│ └── focus_focusing.9.png
│ ├── drawable
│ ├── picture_ic_camera.xml
│ ├── picture_ic_flash_auto.xml
│ ├── picture_ic_flash_off.xml
│ └── picture_ic_flash_on.xml
│ ├── layout
│ └── picture_camera_view.xml
│ ├── values-ar-rAE
│ └── strings.xml
│ ├── values-de-rDE
│ └── strings.xml
│ ├── values-en-rUS
│ └── string.xml
│ ├── values-es-rES
│ └── strings.xml
│ ├── values-fr-rFR
│ └── strings.xml
│ ├── values-ja-rJP
│ └── strings.xml
│ ├── values-ko-rKR
│ └── strings.xml
│ ├── values-pt-rPT
│ └── strings.xml
│ ├── values-ru-rRU
│ └── strings.xml
│ ├── values-vi-rVN
│ └── string.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ └── values
│ ├── attrs.xml
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── compress
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── top
│ │ └── zibin
│ │ └── luban
│ │ ├── Checker.java
│ │ ├── CompressionPredicate.java
│ │ ├── Engine.java
│ │ ├── InputStreamAdapter.java
│ │ ├── InputStreamProvider.java
│ │ ├── Luban.java
│ │ ├── LubanUtils.java
│ │ ├── OnCompressListener.java
│ │ ├── OnNewCompressListener.java
│ │ ├── OnRenameListener.java
│ │ └── io
│ │ ├── ArrayAdapterInterface.java
│ │ ├── ArrayPool.java
│ │ ├── ArrayPoolProvide.java
│ │ ├── BaseKeyPool.java
│ │ ├── BufferedInputStreamWrap.java
│ │ ├── ByteArrayAdapter.java
│ │ ├── GroupedLinkedMap.java
│ │ ├── IntegerArrayAdapter.java
│ │ ├── LruArrayPool.java
│ │ └── PoolAble.java
│ └── res
│ └── values
│ └── strings.xml
├── config.gradle
├── debug
├── app-debug.apk
└── output-metadata.json
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── ijkplayer-java
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── tv
│ │ └── danmaku
│ │ └── ijk
│ │ └── media
│ │ └── player
│ │ └── ApplicationTest.java
│ └── main
│ ├── .classpath
│ ├── .project
│ ├── AndroidManifest.xml
│ ├── java
│ └── tv
│ │ └── danmaku
│ │ └── ijk
│ │ └── media
│ │ └── player
│ │ ├── AbstractMediaPlayer.java
│ │ ├── AndroidMediaPlayer.java
│ │ ├── IMediaPlayer.java
│ │ ├── ISurfaceTextureHolder.java
│ │ ├── ISurfaceTextureHost.java
│ │ ├── IjkLibLoader.java
│ │ ├── IjkMediaCodecInfo.java
│ │ ├── IjkMediaMeta.java
│ │ ├── IjkMediaPlayer.java
│ │ ├── IjkTimedText.java
│ │ ├── MediaInfo.java
│ │ ├── MediaPlayerProxy.java
│ │ ├── TextureMediaPlayer.java
│ │ ├── annotations
│ │ ├── AccessedByNative.java
│ │ └── CalledByNative.java
│ │ ├── exceptions
│ │ └── IjkMediaException.java
│ │ ├── ffmpeg
│ │ └── FFmpegApi.java
│ │ ├── misc
│ │ ├── AndroidMediaFormat.java
│ │ ├── AndroidTrackInfo.java
│ │ ├── IAndroidIO.java
│ │ ├── IMediaDataSource.java
│ │ ├── IMediaFormat.java
│ │ ├── ITrackInfo.java
│ │ ├── IjkMediaFormat.java
│ │ └── IjkTrackInfo.java
│ │ └── pragma
│ │ ├── DebugLog.java
│ │ └── Pragma.java
│ ├── project.properties
│ └── res
│ └── values
│ └── strings.xml
├── image
├── home.jpg
├── picture_audio.jpg
├── picture_circular_crop_new_style.jpg
├── picture_default_style_1.jpg
├── picture_default_style_2.jpg
├── picture_default_style_new_3.jpg
├── picture_framework_cn.png
├── picture_framework_es.png
├── picture_num_style_new_1.jpg
├── picture_num_style_new_2.jpg
├── picture_num_style_new_3.jpg
├── picture_sina_style_1.jpg
├── picture_sina_style_new_2.jpg
├── picture_sina_style_new_3.jpg
├── picture_video.jpg
├── picture_wechat_album_style.jpg
├── picture_wechat_single_style_3.jpg
├── picture_wechat_style_1.jpg
├── picture_wechat_style_2.jpg
├── picture_wechat_style_new_3.jpg
├── picture_white_style.jpeg
└── test.png
├── publish.gradle
├── selector
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── luck
│ │ └── picture
│ │ └── lib
│ │ ├── PictureOnlyCameraFragment.java
│ │ ├── PictureSelectorFragment.java
│ │ ├── PictureSelectorPreviewFragment.java
│ │ ├── PictureSelectorSystemFragment.java
│ │ ├── adapter
│ │ ├── PictureAlbumAdapter.java
│ │ ├── PictureImageGridAdapter.java
│ │ ├── PicturePreviewAdapter.java
│ │ └── holder
│ │ │ ├── AudioViewHolder.java
│ │ │ ├── BasePreviewHolder.java
│ │ │ ├── BaseRecyclerMediaHolder.java
│ │ │ ├── CameraViewHolder.java
│ │ │ ├── ImageViewHolder.java
│ │ │ ├── PreviewAudioHolder.java
│ │ │ ├── PreviewGalleryAdapter.java
│ │ │ ├── PreviewImageHolder.java
│ │ │ ├── PreviewVideoHolder.java
│ │ │ └── VideoViewHolder.java
│ │ ├── animators
│ │ ├── AlphaInAnimationAdapter.java
│ │ ├── AnimationType.java
│ │ ├── BaseAnimationAdapter.java
│ │ ├── SlideInBottomAnimationAdapter.java
│ │ └── ViewHelper.java
│ │ ├── app
│ │ ├── IApp.java
│ │ └── PictureAppMaster.java
│ │ ├── basic
│ │ ├── FragmentInjectManager.java
│ │ ├── IBridgeLoaderFactory.java
│ │ ├── IBridgePictureBehavior.java
│ │ ├── IBridgeViewLifecycle.java
│ │ ├── IPictureSelectorCommonEvent.java
│ │ ├── IPictureSelectorEvent.java
│ │ ├── InterpolatorFactory.java
│ │ ├── PictureCommonFragment.java
│ │ ├── PictureContentResolver.java
│ │ ├── PictureContextWrapper.java
│ │ ├── PictureFileProvider.java
│ │ ├── PictureMediaScannerConnection.java
│ │ ├── PictureSelectionCameraModel.java
│ │ ├── PictureSelectionModel.java
│ │ ├── PictureSelectionPreviewModel.java
│ │ ├── PictureSelectionQueryModel.java
│ │ ├── PictureSelectionSystemModel.java
│ │ ├── PictureSelector.java
│ │ ├── PictureSelectorSupporterActivity.java
│ │ └── PictureSelectorTransparentActivity.java
│ │ ├── config
│ │ ├── Crop.java
│ │ ├── CustomIntentKey.java
│ │ ├── FileSizeUnit.java
│ │ ├── InjectResourceSource.java
│ │ ├── PermissionEvent.java
│ │ ├── PictureConfig.java
│ │ ├── PictureMimeType.java
│ │ ├── SelectLimitType.java
│ │ ├── SelectMimeType.java
│ │ ├── SelectModeConfig.java
│ │ ├── SelectorConfig.java
│ │ ├── SelectorProviders.java
│ │ └── VideoQuality.java
│ │ ├── decoration
│ │ ├── GridSpacingItemDecoration.java
│ │ ├── HorizontalItemDecoration.java
│ │ ├── ViewPage2ItemDecoration.java
│ │ └── WrapContentLinearLayoutManager.java
│ │ ├── dialog
│ │ ├── AlbumListPopWindow.java
│ │ ├── PhotoItemSelectedDialog.java
│ │ ├── PictureCommonDialog.java
│ │ ├── PictureLoadingDialog.java
│ │ └── RemindDialog.java
│ │ ├── engine
│ │ ├── CompressEngine.java
│ │ ├── CompressFileEngine.java
│ │ ├── CropEngine.java
│ │ ├── CropFileEngine.java
│ │ ├── ExtendLoaderEngine.java
│ │ ├── ImageEngine.java
│ │ ├── MediaPlayerEngine.java
│ │ ├── PictureSelectorEngine.java
│ │ ├── SandboxFileEngine.java
│ │ ├── UriToFileTransformEngine.java
│ │ └── VideoPlayerEngine.java
│ │ ├── entity
│ │ ├── LocalMedia.java
│ │ ├── LocalMediaFolder.java
│ │ ├── MediaData.java
│ │ └── MediaExtraInfo.java
│ │ ├── immersive
│ │ ├── ImmersiveManager.java
│ │ ├── LightStatusBarUtils.java
│ │ └── RomUtils.java
│ │ ├── interfaces
│ │ ├── OnAlbumItemClickListener.java
│ │ ├── OnBitmapWatermarkEventListener.java
│ │ ├── OnCallbackIndexListener.java
│ │ ├── OnCallbackListener.java
│ │ ├── OnCameraInterceptListener.java
│ │ ├── OnCustomLoadingListener.java
│ │ ├── OnExternalPreviewEventListener.java
│ │ ├── OnGridItemSelectAnimListener.java
│ │ ├── OnInjectActivityPreviewListener.java
│ │ ├── OnInjectLayoutResourceListener.java
│ │ ├── OnItemClickListener.java
│ │ ├── OnKeyValueResultCallbackListener.java
│ │ ├── OnMediaEditInterceptListener.java
│ │ ├── OnPermissionDeniedListener.java
│ │ ├── OnPermissionDescriptionListener.java
│ │ ├── OnPermissionsInterceptListener.java
│ │ ├── OnPlayerListener.java
│ │ ├── OnPreviewInterceptListener.java
│ │ ├── OnQueryAlbumListener.java
│ │ ├── OnQueryAllAlbumListener.java
│ │ ├── OnQueryDataResultListener.java
│ │ ├── OnQueryDataSourceListener.java
│ │ ├── OnQueryFilterListener.java
│ │ ├── OnRecordAudioInterceptListener.java
│ │ ├── OnRecyclerViewPreloadMoreListener.java
│ │ ├── OnRecyclerViewScrollListener.java
│ │ ├── OnRecyclerViewScrollStateListener.java
│ │ ├── OnRequestPermissionListener.java
│ │ ├── OnResultCallbackListener.java
│ │ ├── OnSelectAnimListener.java
│ │ ├── OnSelectFilterListener.java
│ │ ├── OnSelectLimitTipsListener.java
│ │ └── OnVideoThumbnailEventListener.java
│ │ ├── language
│ │ ├── LanguageConfig.java
│ │ ├── LocaleTransform.java
│ │ └── PictureLanguageUtils.java
│ │ ├── loader
│ │ ├── IBridgeMediaLoader.java
│ │ ├── LocalMediaLoader.java
│ │ ├── LocalMediaPageLoader.java
│ │ └── SandboxFileLoader.java
│ │ ├── magical
│ │ ├── BuildRecycleItemViewParams.java
│ │ ├── MagicalView.java
│ │ ├── MagicalViewWrapper.java
│ │ ├── OnMagicalViewCallback.java
│ │ └── ViewParams.java
│ │ ├── manager
│ │ ├── PictureCacheManager.java
│ │ └── SelectedManager.java
│ │ ├── obj
│ │ └── pool
│ │ │ └── ObjectPools.java
│ │ ├── permissions
│ │ ├── PermissionChecker.java
│ │ ├── PermissionConfig.java
│ │ ├── PermissionResultCallback.java
│ │ └── PermissionUtil.java
│ │ ├── photoview
│ │ ├── Compat.java
│ │ ├── CustomGestureDetector.java
│ │ ├── OnGestureListener.java
│ │ ├── OnMatrixChangedListener.java
│ │ ├── OnOutsidePhotoTapListener.java
│ │ ├── OnPhotoTapListener.java
│ │ ├── OnScaleChangedListener.java
│ │ ├── OnSingleFlingListener.java
│ │ ├── OnViewDragListener.java
│ │ ├── OnViewTapListener.java
│ │ ├── PhotoView.java
│ │ ├── PhotoViewAttacher.java
│ │ └── Util.java
│ │ ├── service
│ │ └── ForegroundService.java
│ │ ├── style
│ │ ├── AlbumWindowStyle.java
│ │ ├── BottomNavBarStyle.java
│ │ ├── PictureSelectorStyle.java
│ │ ├── PictureWindowAnimationStyle.java
│ │ ├── SelectMainStyle.java
│ │ └── TitleBarStyle.java
│ │ ├── thread
│ │ └── PictureThreadUtils.java
│ │ ├── utils
│ │ ├── ActivityCompatHelper.java
│ │ ├── AnimUtils.java
│ │ ├── BitmapUtils.java
│ │ ├── DateUtils.java
│ │ ├── DensityUtil.java
│ │ ├── DoubleUtils.java
│ │ ├── DownloadFileUtils.java
│ │ ├── FileDirMap.java
│ │ ├── IntentUtils.java
│ │ ├── MediaStoreUtils.java
│ │ ├── MediaUtils.java
│ │ ├── PSEglUtils.java
│ │ ├── PictureFileUtils.java
│ │ ├── SandboxTransformUtils.java
│ │ ├── SdkVersionUtils.java
│ │ ├── SortUtils.java
│ │ ├── SpUtils.java
│ │ ├── StyleUtils.java
│ │ ├── ToastUtils.java
│ │ └── ValueOf.java
│ │ └── widget
│ │ ├── BottomNavBar.java
│ │ ├── CompleteSelectView.java
│ │ ├── MarqueeTextView.java
│ │ ├── MediaPlayerView.java
│ │ ├── MediumBoldTextView.java
│ │ ├── PreviewBottomNavBar.java
│ │ ├── PreviewTitleBar.java
│ │ ├── RecyclerPreloadView.java
│ │ ├── RoundCornerRelativeLayout.java
│ │ ├── SlideSelectTouchListener.java
│ │ ├── SlideSelectionHandler.java
│ │ ├── SquareRelativeLayout.java
│ │ └── TitleBar.java
│ └── res
│ ├── anim
│ ├── ps_anim_album_dismiss.xml
│ ├── ps_anim_album_show.xml
│ ├── ps_anim_alpha_enter.xml
│ ├── ps_anim_alpha_exit.xml
│ ├── ps_anim_anticipate_interpolator.xml
│ ├── ps_anim_down_out.xml
│ ├── ps_anim_enter.xml
│ ├── ps_anim_exit.xml
│ ├── ps_anim_fade_in.xml
│ ├── ps_anim_fade_out.xml
│ ├── ps_anim_fall_enter.xml
│ ├── ps_anim_layout_fall_enter.xml
│ ├── ps_anim_modal_in.xml
│ ├── ps_anim_modal_out.xml
│ ├── ps_anim_overshoot_interpolator.xml
│ └── ps_anim_up_in.xml
│ ├── drawable-xxhdpi
│ ├── ps_ic_audio.png
│ ├── ps_ic_audio_placeholder.png
│ ├── ps_ic_audio_play.png
│ ├── ps_ic_audio_play_cover.png
│ ├── ps_ic_audio_stop.png
│ ├── ps_ic_back.png
│ ├── ps_ic_black_back.png
│ ├── ps_ic_camera.png
│ ├── ps_ic_default_arrow.png
│ ├── ps_ic_delete.png
│ ├── ps_ic_editor.png
│ ├── ps_ic_fast_play.png
│ ├── ps_ic_grey_arrow.png
│ ├── ps_ic_no_data.png
│ ├── ps_ic_normal.png
│ ├── ps_ic_normal_back.png
│ ├── ps_ic_placeholder.png
│ ├── ps_ic_preview_selected.png
│ ├── ps_ic_progress.png
│ ├── ps_ic_seek_bar_thumb.png
│ ├── ps_ic_selected.png
│ ├── ps_ic_shadow_bg.png
│ ├── ps_ic_slow_audio.png
│ ├── ps_ic_trans_1px.9.png
│ ├── ps_ic_video.png
│ └── ps_ic_video_play.png
│ ├── drawable
│ ├── ps_album_bg.xml
│ ├── ps_anim_progress.xml
│ ├── ps_audio_placeholder.xml
│ ├── ps_btn_left_bottom_selector.xml
│ ├── ps_btn_left_normal.xml
│ ├── ps_btn_left_select.xml
│ ├── ps_btn_right_bottom_selector.xml
│ ├── ps_btn_right_normal.xml
│ ├── ps_btn_right_select.xml
│ ├── ps_btn_selector.xml
│ ├── ps_cancel_default_bg.xml
│ ├── ps_checkbox_selector.xml
│ ├── ps_default_num_oval_normal.xml
│ ├── ps_default_num_oval_selected.xml
│ ├── ps_default_num_selector.xml
│ ├── ps_dialog_loading_bg.xml
│ ├── ps_dialog_shadow.xml
│ ├── ps_gif_tag.xml
│ ├── ps_image_placeholder.xml
│ ├── ps_item_select_bg.xml
│ ├── ps_layer_progress.xml
│ ├── ps_num_oval.xml
│ ├── ps_orange_oval.xml
│ ├── ps_original_checkbox.xml
│ ├── ps_original_wechat_normal.xml
│ ├── ps_original_wechat_selected.xml
│ ├── ps_preview_checkbox_selector.xml
│ ├── ps_preview_gallery_bg.xml
│ ├── ps_preview_gallery_frame.xml
│ ├── ps_seek_bar_thumb_normal.xml
│ ├── ps_seek_bar_thumb_pressed.xml
│ ├── ps_select_complete_bg.xml
│ ├── ps_select_complete_normal_bg.xml
│ ├── ps_transparent_space.xml
│ ├── ps_view_normal.xml
│ └── ps_view_press.xml
│ ├── layout
│ ├── ps_activity_container.xml
│ ├── ps_album_folder_item.xml
│ ├── ps_alert_dialog.xml
│ ├── ps_bottom_nav_bar.xml
│ ├── ps_common_dialog.xml
│ ├── ps_complete_selected_layout.xml
│ ├── ps_custom_preview_image.xml
│ ├── ps_dialog_camera_selected.xml
│ ├── ps_empty.xml
│ ├── ps_fragment_preview.xml
│ ├── ps_fragment_selector.xml
│ ├── ps_item_grid_audio.xml
│ ├── ps_item_grid_camera.xml
│ ├── ps_item_grid_image.xml
│ ├── ps_item_grid_video.xml
│ ├── ps_preview_audio.xml
│ ├── ps_preview_gallery_item.xml
│ ├── ps_preview_image.xml
│ ├── ps_preview_video.xml
│ ├── ps_remind_dialog.xml
│ ├── ps_title_bar.xml
│ └── ps_window_folder.xml
│ ├── raw
│ └── ps_click_music.wav
│ ├── values-ar-rAE
│ └── strings.xml
│ ├── values-cs-rCZ
│ └── string.xml
│ ├── values-de-rDE
│ └── strings.xml
│ ├── values-en-rUS
│ └── string.xml
│ ├── values-es-rES
│ └── strings.xml
│ ├── values-fr-rFR
│ └── strings.xml
│ ├── values-ja-rJP
│ └── strings.xml
│ ├── values-kk-rKZ
│ └── string.xml
│ ├── values-ko-rKR
│ └── strings.xml
│ ├── values-pt-rPT
│ └── strings.xml
│ ├── values-ru-rRU
│ └── strings.xml
│ ├── values-vi-rVN
│ └── string.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ ├── values
│ ├── attrs.xml
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
│ └── xml
│ └── ps_file_paths.xml
├── settings.gradle
└── ucrop
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
└── main
├── AndroidManifest.xml
├── java
└── com
│ └── yalantis
│ └── ucrop
│ ├── OkHttpClientStore.java
│ ├── UCrop.java
│ ├── UCropActivity.java
│ ├── UCropDevelopConfig.java
│ ├── UCropFragment.java
│ ├── UCropFragmentCallback.java
│ ├── UCropGalleryAdapter.java
│ ├── UCropImageEngine.java
│ ├── UCropMultipleActivity.java
│ ├── callback
│ ├── BitmapCropCallback.java
│ ├── BitmapLoadCallback.java
│ ├── CropBoundsChangeListener.java
│ └── OverlayViewChangeListener.java
│ ├── decoration
│ └── GridSpacingItemDecoration.java
│ ├── model
│ ├── AspectRatio.java
│ ├── CropParameters.java
│ ├── CustomIntentKey.java
│ ├── ExifInfo.java
│ └── ImageState.java
│ ├── statusbar
│ ├── ImmersiveManager.java
│ ├── LightStatusBarUtils.java
│ └── RomUtils.java
│ ├── task
│ ├── BitmapCropTask.java
│ └── BitmapLoadTask.java
│ ├── util
│ ├── BitmapLoadUtils.java
│ ├── CubicEasing.java
│ ├── DensityUtil.java
│ ├── EglUtils.java
│ ├── FastBitmapDrawable.java
│ ├── FileUtils.java
│ ├── ImageHeaderParser.java
│ ├── RectUtils.java
│ ├── RotationGestureDetector.java
│ └── SelectedStateListDrawable.java
│ └── view
│ ├── CropImageView.java
│ ├── GestureCropImageView.java
│ ├── OverlayView.java
│ ├── TransformImageView.java
│ ├── UCropView.java
│ └── widget
│ ├── AspectRatioTextView.java
│ └── HorizontalProgressWheelView.java
└── res
├── anim
├── ucrop_item_animation_fall_down.xml
├── ucrop_layout_animation_fall_down.xml
├── ucrop_loader_circle_path.xml
└── ucrop_loader_circle_scale.xml
├── color
└── ucrop_scale_text_view_selector.xml
├── drawable-hdpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable-ldpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable-mdpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable-xhdpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable-xxhdpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable-xxxhdpi
├── ucrop_ic_angle.png
└── ucrop_ic_done.png
├── drawable
├── ucrop_crop.xml
├── ucrop_gallery_bg.xml
├── ucrop_gallery_current.xml
├── ucrop_ic_crop.xml
├── ucrop_ic_crop_unselected.xml
├── ucrop_ic_cross.xml
├── ucrop_ic_next.xml
├── ucrop_ic_reset.xml
├── ucrop_ic_rotate.xml
├── ucrop_ic_rotate_unselected.xml
├── ucrop_ic_scale.xml
├── ucrop_ic_scale_unselected.xml
├── ucrop_rotate.xml
├── ucrop_scale.xml
├── ucrop_shadow_upside.xml
├── ucrop_vector_ic_crop.xml
├── ucrop_vector_loader.xml
├── ucrop_vector_loader_animated.xml
└── ucrop_wrapper_controls_shape.xml
├── layout
├── ucrop_activity_multiple.xml
├── ucrop_activity_photobox.xml
├── ucrop_aspect_ratio.xml
├── ucrop_controls.xml
├── ucrop_fragment_photobox.xml
├── ucrop_gallery_adapter_item.xml
├── ucrop_layout_rotate_wheel.xml
├── ucrop_layout_scale_wheel.xml
└── ucrop_view.xml
├── menu
└── ucrop_menu_activity.xml
├── values-ar-rAE
└── strings.xml
├── values-de-rDE
└── strings.xml
├── values-en-rUS
└── string.xml
├── values-es-rES
└── strings.xml
├── values-fr-rFR
└── strings.xml
├── values-ja-rJP
└── strings.xml
├── values-ko-rKR
└── strings.xml
├── values-pt-rPT
└── strings.xml
├── values-ru-rRU
└── strings.xml
├── values-vi-rVN
└── string.xml
├── values-zh-rCN
└── strings.xml
├── values-zh-rTW
└── strings.xml
└── values
├── attrs.xml
├── colors.xml
├── dimens.xml
├── public.xml
├── strings.xml
├── styles.xml
└── values.xml
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## Current use version?
2 | #### 当前使用的版本是多少?
3 |
4 | ```
5 |
6 | ```
7 |
8 | ## Will this problem occur in demo?
9 | #### Demo能否复现这问题?
10 |
11 | ```
12 |
13 | ```
14 |
15 | ## Describe the problem or provide an error log?
16 | #### 描述问题或提供错误log?
17 |
18 | ```
19 |
20 | ```
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | /.idea/
10 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/demo/demo_2023-12-17_060744_v3.11.2.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/demo/demo_2023-12-17_060744_v3.11.2.apk
--------------------------------------------------------------------------------
/app/libs/arm64-v8a/libijkffmpeg.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijkffmpeg.so
--------------------------------------------------------------------------------
/app/libs/arm64-v8a/libijkplayer.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijkplayer.so
--------------------------------------------------------------------------------
/app/libs/arm64-v8a/libijksdl.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijksdl.so
--------------------------------------------------------------------------------
/app/libs/armeabi/libijkffmpeg.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijkffmpeg.so
--------------------------------------------------------------------------------
/app/libs/armeabi/libijkplayer.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijkplayer.so
--------------------------------------------------------------------------------
/app/libs/armeabi/libijksdl.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijksdl.so
--------------------------------------------------------------------------------
/app/signature/picture.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/signature/picture.jks
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/CustomBottomNavBar.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 |
7 | import com.luck.picture.lib.widget.BottomNavBar;
8 |
9 | /**
10 | * @author:luck
11 | * @date:2021/11/17 10:46 上午
12 | * @describe:CustomBottomNavBar
13 | */
14 | public class CustomBottomNavBar extends BottomNavBar implements View.OnClickListener {
15 |
16 | public CustomBottomNavBar(Context context) {
17 | super(context);
18 | }
19 |
20 | public CustomBottomNavBar(Context context, AttributeSet attrs) {
21 | super(context, attrs);
22 | }
23 |
24 | public CustomBottomNavBar(Context context, AttributeSet attrs, int defStyleAttr) {
25 | super(context, attrs, defStyleAttr);
26 | }
27 |
28 | @Override
29 | protected void inflateLayout() {
30 | inflate(getContext(), R.layout.ps_custom_bottom_nav_bar, this);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/CustomPreviewBottomNavBar.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 |
6 | import com.luck.picture.lib.widget.PreviewBottomNavBar;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2021/11/17 10:46 上午
11 | * @describe:CustomPreviewBottomNavBar
12 | */
13 | public class CustomPreviewBottomNavBar extends PreviewBottomNavBar {
14 |
15 | public CustomPreviewBottomNavBar(Context context) {
16 | super(context);
17 | }
18 |
19 | public CustomPreviewBottomNavBar(Context context, AttributeSet attrs) {
20 | super(context, attrs);
21 | }
22 |
23 | public CustomPreviewBottomNavBar(Context context, AttributeSet attrs, int defStyleAttr) {
24 | super(context, attrs, defStyleAttr);
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/CustomPreviewFragment.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector;
2 |
3 | import android.os.Bundle;
4 |
5 | import com.luck.picture.lib.PictureSelectorPreviewFragment;
6 | import com.luck.picture.lib.adapter.PicturePreviewAdapter;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2022/2/21 4:15 下午
11 | * @describe:CustomPreviewFragment
12 | */
13 | public class CustomPreviewFragment extends PictureSelectorPreviewFragment {
14 |
15 | public static CustomPreviewFragment newInstance() {
16 | CustomPreviewFragment fragment = new CustomPreviewFragment();
17 | fragment.setArguments(new Bundle());
18 | return fragment;
19 | }
20 |
21 | @Override
22 | public String getFragmentTag() {
23 | return CustomPreviewFragment.class.getSimpleName();
24 | }
25 |
26 | @Override
27 | protected PicturePreviewAdapter createAdapter() {
28 | return new CustomPreviewAdapter();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/CustomPreviewTitleBar.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 |
6 | import com.luck.picture.lib.widget.PreviewTitleBar;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2021/11/19 4:38 下午
11 | * @describe:CustomPreviewTitleBar
12 | */
13 | public class CustomPreviewTitleBar extends PreviewTitleBar {
14 |
15 | public CustomPreviewTitleBar(Context context) {
16 | super(context);
17 | }
18 |
19 | public CustomPreviewTitleBar(Context context, AttributeSet attrs) {
20 | super(context, attrs);
21 | }
22 |
23 | public CustomPreviewTitleBar(Context context, AttributeSet attrs, int defStyleAttr) {
24 | super(context, attrs, defStyleAttr);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/listener/DragListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector.listener;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-01-13 17:00
6 | * @describe:拖拽监听事件
7 | */
8 | public interface DragListener {
9 | /**
10 | * 是否将 item拖动到删除处,根据状态改变颜色
11 | *
12 | * @param isDelete
13 | */
14 | void deleteState(boolean isDelete);
15 |
16 | /**
17 | * 是否于拖拽状态
18 | *
19 | * @param start
20 | */
21 | void dragState(boolean isStart);
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/luck/pictureselector/listener/OnItemLongClickListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.pictureselector.listener;
2 |
3 | import android.view.View;
4 |
5 | import androidx.recyclerview.widget.RecyclerView;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2020-01-13 17:58
10 | * @describe:长按事件
11 | */
12 | public interface OnItemLongClickListener {
13 | void onItemLongClick(RecyclerView.ViewHolder holder, int position, View v);
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_add_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_add_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_dump_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_dump_delete.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_item_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_item_delete.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mark_win.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_mark_win.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_minus.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_normal_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_normal_delete.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_play.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_plus.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_check.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ps_select_check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ps_select_check.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_blue_num_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_blue_num_selected.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_blue_num_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_custom_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_only_album_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_permission_desc_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_preview_blue_num_selected.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_preview_blue_num_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_preview_grey_oval_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_transparent_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ps_demo_white_preview_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_only_query_data.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_simp.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/custom_alert_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ps_custom_preview_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #393a3e
4 | #000000
5 | #f6f6f6
6 | #fafafa
7 | #B6B6B6
8 | #f94c51
9 | #43c117
10 | #53575e
11 | #00000000
12 | #FFFFFF
13 | #E0DBDBDB
14 | #7D7DFF
15 | #9b9b9b
16 | #E0FF6100
17 | #FF0000
18 | #CCFF0000
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | PictureSelector
3 | 拖动到此处删除
4 | 松手即可删除
5 | 发送
6 | 发送(%1$d/%2$d)
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | apply from: "config.gradle"
3 |
4 | buildscript {
5 | repositories {
6 | google()
7 | mavenCentral()
8 | maven {
9 | url 'https://maven.google.com/'
10 | name 'Google'
11 | }
12 | }
13 | dependencies {
14 | classpath 'com.android.tools.build:gradle:7.4.2'
15 | classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
16 | // NOTE: Do not place your application dependencies here; they belong
17 | // in the individual module build.gradle files
18 | }
19 | }
20 |
21 | allprojects {
22 |
23 | repositories {
24 | google()
25 | mavenCentral()
26 | maven {
27 | url 'https://maven.google.com/'
28 | name 'Google'
29 | }
30 | }
31 | }
32 |
33 | task clean(type: Delete) {
34 | delete rootProject.buildDir
35 | }
36 |
--------------------------------------------------------------------------------
/camerax/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/camerax/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/camerax/consumer-rules.pro
--------------------------------------------------------------------------------
/camerax/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/camerax/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/CameraImageEngine.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax;
2 |
3 | import android.content.Context;
4 | import android.widget.ImageView;
5 |
6 | /**
7 | * @author:luck
8 | * @date:2021/12/1 9:53 下午
9 | * @describe:CameraImageEngine
10 | */
11 | public interface CameraImageEngine {
12 | /**
13 | * load image source
14 | *
15 | * @param context
16 | * @param url
17 | * @param imageView
18 | */
19 | void loadImage(Context context, String url, ImageView imageView);
20 | }
21 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/CameraListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-01-04 13:38
8 | * @describe:相机回调监听
9 | */
10 | public interface CameraListener {
11 | /**
12 | * 拍照成功返回
13 | *
14 | * @param url
15 | */
16 | void onPictureSuccess(@NonNull String url);
17 |
18 | /**
19 | * 录像成功返回
20 | *
21 | * @param url
22 | */
23 | void onRecordSuccess(@NonNull String url);
24 |
25 | /**
26 | * 使用相机出错
27 | *
28 | * @param file
29 | */
30 | void onError(int videoCaptureError, String message, Throwable cause);
31 | }
32 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/CaptureListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-01-04 13:38
6 | * @describe:CaptureListener
7 | */
8 | public interface CaptureListener {
9 | void takePictures();
10 |
11 | void recordShort(long time);
12 |
13 | void recordStart();
14 |
15 | void recordEnd(long time);
16 |
17 | void changeTime(long duration);
18 |
19 | void recordZoom(float zoom);
20 |
21 | void recordError();
22 | }
23 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/ClickListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-01-04 13:45
6 | * @describe:点击事件监听
7 | */
8 | public interface ClickListener {
9 | void onClick();
10 | }
11 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/IObtainCameraView.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | import android.view.ViewGroup;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/3/15 12:18 下午
8 | * @describe:IObtainCameraView
9 | */
10 | public interface IObtainCameraView {
11 | ViewGroup getCustomCameraView();
12 | }
13 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/ImageCallbackListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | import android.widget.ImageView;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-01-04 15:55
8 | * @describe:图片加载
9 | */
10 | public interface ImageCallbackListener {
11 | /**
12 | * 加载图片回调
13 | *
14 | * @param url 资源url
15 | * @param imageView 图片渲染控件
16 | */
17 | void onLoadImage(String url, ImageView imageView);
18 | }
19 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/OnSimpleXPermissionDeniedListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/3/15 8:33 下午
8 | * @describe:OnPermissionDeniedListener
9 | */
10 | public interface OnSimpleXPermissionDeniedListener {
11 | /**
12 | * Permission denied
13 | *
14 | * @param permission Permission
15 | * @param requestCode Jump to the {@link .startActivityForResult # requestCode} used in system settings
16 | */
17 | void onDenied(Context context, String permission, int requestCode);
18 | }
19 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/OnSimpleXPermissionDescriptionListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | import android.content.Context;
4 | import android.view.ViewGroup;
5 |
6 | /**
7 | * @author:luck
8 | * @date:2021/12/1 8:48 下午
9 | * @describe:OnSimpleXPermissionDescriptionListener
10 | */
11 | public interface OnSimpleXPermissionDescriptionListener {
12 | /**
13 | * Permission description
14 | *
15 | * @param context
16 | * @param permission
17 | */
18 | void onPermissionDescription(Context context, ViewGroup viewGroup, String permission);
19 |
20 | /**
21 | * onDismiss
22 | */
23 | void onDismiss(ViewGroup viewGroup);
24 | }
25 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/listener/TypeListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.listener;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-01-04 13:38
6 | * @describe:TypeListener
7 | */
8 | public interface TypeListener {
9 | void cancel();
10 |
11 | void confirm();
12 | }
13 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/permissions/PermissionResultCallback.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.permissions;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/11/18 10:15 上午
6 | * @describe:PermissionResultCallback
7 | */
8 | public interface PermissionResultCallback {
9 |
10 | void onGranted();
11 |
12 | void onDenied();
13 | }
14 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/utils/DateUtils.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.utils;
2 |
3 | import java.text.SimpleDateFormat;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/11/29 8:33 下午
8 | * @describe:DateUtils
9 | */
10 | public class DateUtils {
11 |
12 | private static final SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
13 |
14 | /**
15 | * 根据时间戳创建文件名
16 | *
17 | * @param prefix 前缀名
18 | * @return
19 | */
20 | public static String getCreateFileName(String prefix) {
21 | long millis = System.currentTimeMillis();
22 | return prefix + sf.format(millis);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/utils/DoubleUtils.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.utils;
2 |
3 | import android.os.SystemClock;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2019-01-04 13:41
8 | * @describe:DoubleUtils
9 | */
10 | public class DoubleUtils {
11 | /**
12 | * Prevent continuous click, jump two pages
13 | */
14 | private static long lastClickTime;
15 | private final static long TIME = 800;
16 |
17 | public static boolean isFastDoubleClick() {
18 | long time = SystemClock.elapsedRealtime();
19 | if (time - lastClickTime < TIME) {
20 | return true;
21 | }
22 | lastClickTime = time;
23 | return false;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/camerax/src/main/java/com/luck/lib/camerax/utils/SimpleXSpUtils.java:
--------------------------------------------------------------------------------
1 | package com.luck.lib.camerax.utils;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 |
6 | import com.luck.lib.camerax.CustomCameraConfig;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2022/3/15 6:26 下午
11 | * @describe:SimpleXSpUtils
12 | */
13 | public class SimpleXSpUtils {
14 | private static SharedPreferences pictureSpUtils;
15 |
16 | private static SharedPreferences getSp(Context context) {
17 | if (pictureSpUtils == null) {
18 | pictureSpUtils = context.getSharedPreferences(CustomCameraConfig.SP_NAME, Context.MODE_PRIVATE);
19 | }
20 | return pictureSpUtils;
21 | }
22 |
23 | public static void putBoolean(Context context, String key, boolean value) {
24 | getSp(context).edit().putBoolean(key, value).apply();
25 | }
26 |
27 | public static boolean getBoolean(Context context, String key, boolean defValue) {
28 | return getSp(context).getBoolean(key, defValue);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/camerax/src/main/res/anim/focusview_show.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
17 |
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable-xxhdpi/focus_failed.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/camerax/src/main/res/drawable-xxhdpi/focus_failed.9.png
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable-xxhdpi/focus_focused.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/camerax/src/main/res/drawable-xxhdpi/focus_focused.9.png
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable-xxhdpi/focus_focusing.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/camerax/src/main/res/drawable-xxhdpi/focus_focusing.9.png
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable/picture_ic_camera.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable/picture_ic_flash_auto.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable/picture_ic_flash_off.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/camerax/src/main/res/drawable/picture_ic_flash_on.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-ar-rAE/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | انقر لالتقاط صورة
3 | اضغط لفترة طويلة لالتقاط الفيديو
4 | انقر لالتقاط صورة، اضغط لفترة طويلة لالتقاط الفيديو
5 | وقت التسجيل قصير جدًا
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-de-rDE/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Fotografie
3 | Lange Presse Videoband
4 | Machen Sie ein Foto
5 | Die Aufnahmezeit ist zu kurz
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-en-rUS/string.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | recording time is too short
4 | Photograph, photograph
5 | Take Picture
6 | Long Press Camera
7 |
8 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-es-rES/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Haga clic para tomar foto, mantenga pulsado para grabar video
4 | Haga clic para tomar foto
5 | pulsado para grabar video
6 | El tiempo de grabación es demasiado corto
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-fr-rFR/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Clic photo
3 | Imagerie
4 | La durée d’enregistrement est trop courte
5 | Prendre des photos, filmer
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-ja-rJP/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 写真を撮る
3 | 長押しする
4 | 収録時間が短すぎる
5 | 写真を撮る
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-ko-rKR/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 사진 찍기 클릭
3 | 카메라
4 | 녹화 시간이 너무 짧다
5 | 사진 찍기
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-pt-rPT/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tempo de gravação é muito curto
4 | Tirar fotos,Câmara
5 | Tirar fotos
6 | Câmara
7 |
8 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-ru-rRU/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Слишком короткая запись
3 | Нажмите для фотографирования
4 | рисунок щелчок
5 | видео зажать
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-vi-rVN/string.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Ảnh
4 | Máy ảnh dài
5 | Thời gian ghi âm quá ngắn
6 | Chụp ảnh đi
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 录制时间过短
3 | 单击拍照,长按摄像
4 | 单击拍照
5 | 长按摄像
6 |
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values-zh-rTW/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 錄制時間過短
4 | 单击拍照,長按攝像
5 | 點擊拍照
6 | 長按攝像
7 |
8 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #000000
4 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 录制时间过短
4 | 单击拍照,长按摄像
5 | 单击拍照
6 | 长按摄像
7 |
--------------------------------------------------------------------------------
/camerax/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/compress/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | gradle.properties
--------------------------------------------------------------------------------
/compress/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
9 | }
10 | }
11 |
12 | android {
13 | compileSdkVersion 27
14 |
15 | defaultConfig {
16 | minSdkVersion 14
17 | targetSdkVersion 27
18 | }
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 | }
26 |
27 | ext {
28 | PUBLISH_ARTIFACT_ID = "compress"
29 | }
30 |
31 | apply from: '../publish.gradle'
32 |
33 | dependencies {}
--------------------------------------------------------------------------------
/compress/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/sweetspot/Library/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/compress/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/CompressionPredicate.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | /**
4 | * Created on 2018/1/3 19:43
5 | *
6 | * @author andy
7 | *
8 | * A functional interface (callback) that returns true or false for the given input path should be compressed.
9 | */
10 |
11 | public interface CompressionPredicate {
12 |
13 | /**
14 | * Determine the given input path should be compressed and return a boolean.
15 | * @param path input path
16 | * @return the boolean result
17 | */
18 | boolean apply(String path);
19 | }
20 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/InputStreamAdapter.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 |
6 | import top.zibin.luban.io.ArrayPoolProvide;
7 |
8 | /**
9 | * Automatically close the previous InputStream when opening a new InputStream,
10 | * and finally need to manually call {@link #close()} to release the resource.
11 | */
12 | public abstract class InputStreamAdapter implements InputStreamProvider {
13 |
14 | @Override
15 | public InputStream open() throws IOException {
16 | return openInternal();
17 | }
18 |
19 | public abstract InputStream openInternal() throws IOException;
20 |
21 | @Override
22 | public void close() {
23 | ArrayPoolProvide.getInstance().clearMemory();
24 | }
25 | }
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/InputStreamProvider.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 |
6 | /**
7 | * 通过此接口获取输入流,以兼容文件、FileProvider方式获取到的图片
8 | *
9 | * Get the input stream through this interface, and obtain the picture using compatible files and FileProvider
10 | */
11 | public interface InputStreamProvider {
12 |
13 | InputStream open() throws IOException;
14 |
15 | void close();
16 |
17 | int getIndex();
18 |
19 | String getPath();
20 | }
21 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/OnCompressListener.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | import java.io.File;
4 |
5 | public interface OnCompressListener {
6 |
7 | /**
8 | * Fired when the compression is started, override to handle in your own code
9 | */
10 | void onStart();
11 |
12 | /**
13 | * Fired when a compression returns successfully, override to handle in your own code
14 | *
15 | * @param index compression index
16 | */
17 | void onSuccess(int index, File compressFile);
18 |
19 | /**
20 | * Fired when a compression fails to complete, override to handle in your own code
21 | *
22 | * @param index compression error index
23 | */
24 | void onError(int index, Throwable e);
25 | }
26 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/OnNewCompressListener.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | import java.io.File;
4 |
5 | public interface OnNewCompressListener {
6 |
7 | /**
8 | * Fired when the compression is started, override to handle in your own code
9 | */
10 | void onStart();
11 |
12 | /**
13 | * Fired when a compression returns successfully, override to handle in your own code
14 | */
15 | void onSuccess(String source, File compressFile);
16 |
17 | /**
18 | * Fired when a compression fails to complete, override to handle in your own code
19 | */
20 | void onError(String source, Throwable e);
21 | }
22 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/OnRenameListener.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban;
2 |
3 | /**
4 | * Author: zibin
5 | * Datetime: 2018/5/18
6 | *
7 | * 提供修改压缩图片命名接口
8 | *
9 | * A functional interface (callback) that used to rename the file after compress.
10 | */
11 | public interface OnRenameListener {
12 |
13 | /**
14 | * 压缩前调用该方法用于修改压缩后文件名
15 | *
16 | * Call before compression begins.
17 | *
18 | * @param filePath 传入文件路径/ file path
19 | * @return 返回重命名后的字符串/ file name
20 | */
21 | String rename(String filePath);
22 | }
23 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/io/ArrayAdapterInterface.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban.io;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/8/26 3:19 下午
6 | * @describe:ArrayAdapterInterface
7 | */
8 | interface ArrayAdapterInterface {
9 |
10 | /**
11 | * TAG for logging.
12 | */
13 | String getTag();
14 |
15 | /**
16 | * Return the length of the given array.
17 | */
18 | int getArrayLength(T array);
19 |
20 | /**
21 | * Allocate and return an array of the specified size.
22 | */
23 | T newArray(int length);
24 |
25 | /**
26 | * Return the size of an element in the array in bytes (e.g. for int return 4).
27 | */
28 | int getElementSizeInBytes();
29 | }
30 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/io/BaseKeyPool.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban.io;
2 |
3 | import java.util.ArrayDeque;
4 | import java.util.Queue;
5 |
6 | /**
7 | * @author:luck
8 | * @date:2021/8/26 3:13 下午
9 | * @describe:BaseKeyPool
10 | */
11 | abstract class BaseKeyPool {
12 | private static final int MAX_SIZE = 20;
13 | private final Queue keyPool = createQueue(MAX_SIZE);
14 |
15 | T get() {
16 | T result = keyPool.poll();
17 | if (result == null) {
18 | result = create();
19 | }
20 | return result;
21 | }
22 |
23 | public void offer(T key) {
24 | if (keyPool.size() < MAX_SIZE) {
25 | keyPool.offer(key);
26 | }
27 | }
28 |
29 | public static Queue createQueue(int size) {
30 | return new ArrayDeque<>(size);
31 | }
32 |
33 | abstract T create();
34 | }
35 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/io/ByteArrayAdapter.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban.io;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/8/26 3:20 下午
6 | * @describe:ByteArrayAdapter
7 | */
8 | public final class ByteArrayAdapter implements ArrayAdapterInterface {
9 | private static final String TAG = "ByteArrayPool";
10 |
11 | @Override
12 | public String getTag() {
13 | return TAG;
14 | }
15 |
16 | @Override
17 | public int getArrayLength(byte[] array) {
18 | return array.length;
19 | }
20 |
21 | @Override
22 | public byte[] newArray(int length) {
23 | return new byte[length];
24 | }
25 |
26 | @Override
27 | public int getElementSizeInBytes() {
28 | return 1;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/io/IntegerArrayAdapter.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban.io;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/8/26 3:21 下午
6 | * @describe:IntegerArrayAdapter
7 | */
8 | public final class IntegerArrayAdapter implements ArrayAdapterInterface {
9 | private static final String TAG = "IntegerArrayPool";
10 |
11 | @Override
12 | public String getTag() {
13 | return TAG;
14 | }
15 |
16 | @Override
17 | public int getArrayLength(int[] array) {
18 | return array.length;
19 | }
20 |
21 | @Override
22 | public int[] newArray(int length) {
23 | return new int[length];
24 | }
25 |
26 | @Override
27 | public int getElementSizeInBytes() {
28 | return 4;
29 | }
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/compress/src/main/java/top/zibin/luban/io/PoolAble.java:
--------------------------------------------------------------------------------
1 | package top.zibin.luban.io;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/8/26 3:12 下午
6 | * @describe:PoolAble
7 | */
8 | public interface PoolAble {
9 | void offer();
10 | }
11 |
--------------------------------------------------------------------------------
/compress/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Luban
3 |
4 |
--------------------------------------------------------------------------------
/debug/app-debug.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/debug/app-debug.apk
--------------------------------------------------------------------------------
/debug/output-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "artifactType": {
4 | "type": "APK",
5 | "kind": "Directory"
6 | },
7 | "applicationId": "com.luck.pictureselector",
8 | "variantName": "debug",
9 | "elements": [
10 | {
11 | "type": "SINGLE",
12 | "filters": [],
13 | "properties": [],
14 | "versionCode": 31,
15 | "versionName": "2.6.1",
16 | "enabled": true,
17 | "outputFile": "app-debug.apk"
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
10 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
11 | # When configured, Gradle will run in incubating parallel mode.
12 | # This option should only be used with decoupled projects. More details, visit
13 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
14 | # org.gradle.parallel=true
15 |
16 | android.useAndroidX=true
17 | android.injected.testOnly=false
18 |
19 |
20 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Apr 27 15:06:02 CST 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
7 |
--------------------------------------------------------------------------------
/ijkplayer-java/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/ijkplayer-java/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | // http://tools.android.com/tech-docs/new-build-system/tips
5 | //noinspection GroovyAssignabilityCheck
6 | compileSdkVersion 30
7 | //noinspection GroovyAssignabilityCheck
8 | buildToolsVersion "30.0.3"
9 |
10 | lintOptions {
11 | abortOnError false
12 | }
13 | defaultConfig {
14 | minSdkVersion 9
15 | targetSdkVersion 30
16 | }
17 | buildTypes {
18 | release {
19 | minifyEnabled false
20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
21 | }
22 | }
23 | }
24 |
25 | dependencies {
26 | implementation fileTree(dir: 'libs', include: ['*.jar'])
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/ijkplayer-java/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=ijkplayer-java
2 | POM_ARTIFACT_ID=ijkplayer-java
3 | POM_PACKAGING=aar
--------------------------------------------------------------------------------
/ijkplayer-java/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /opt/android/ADK/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/androidTest/java/tv/danmaku/ijk/media/player/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package tv.danmaku.ijk.media.player;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | ijkplayer-java
4 |
5 |
6 |
7 |
8 |
9 | com.android.ide.eclipse.adt.ResourceManagerBuilder
10 |
11 |
12 |
13 |
14 | com.android.ide.eclipse.adt.PreCompilerBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.jdt.core.javabuilder
20 |
21 |
22 |
23 |
24 | com.android.ide.eclipse.adt.ApkBuilder
25 |
26 |
27 |
28 |
29 |
30 | com.android.ide.eclipse.adt.AndroidNature
31 | org.eclipse.jdt.core.javanature
32 |
33 |
34 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
6 |
7 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/ISurfaceTextureHolder.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2015 Bilibili
3 | * Copyright (C) 2015 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player;
19 |
20 | import android.graphics.SurfaceTexture;
21 |
22 | public interface ISurfaceTextureHolder {
23 | void setSurfaceTexture(SurfaceTexture surfaceTexture);
24 |
25 | SurfaceTexture getSurfaceTexture();
26 |
27 | void setSurfaceTextureHost(ISurfaceTextureHost surfaceTextureHost);
28 | }
29 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/ISurfaceTextureHost.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2015 Bilibili
3 | * Copyright (C) 2015 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player;
19 |
20 | import android.graphics.SurfaceTexture;
21 |
22 | public interface ISurfaceTextureHost {
23 | void releaseSurfaceTexture(SurfaceTexture surfaceTexture);
24 | }
25 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkLibLoader.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2013-2014 Bilibili
3 | * Copyright (C) 2013-2014 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player;
19 |
20 | public interface IjkLibLoader {
21 | void loadLibrary(String libName) throws UnsatisfiedLinkError,
22 | SecurityException;
23 | }
24 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2013-2014 Bilibili
3 | * Copyright (C) 2013-2014 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player;
19 |
20 | public class MediaInfo {
21 | public String mMediaPlayerName;
22 |
23 | public String mVideoDecoder;
24 | public String mVideoDecoderImpl;
25 |
26 | public String mAudioDecoder;
27 | public String mAudioDecoderImpl;
28 |
29 | public IjkMediaMeta mMeta;
30 | }
31 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/exceptions/IjkMediaException.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2013-2014 Bilibili
3 | * Copyright (C) 2013-2014 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player.exceptions;
19 |
20 | public class IjkMediaException extends Exception {
21 | private static final long serialVersionUID = 7234796519009099506L;
22 | }
23 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/ffmpeg/FFmpegApi.java:
--------------------------------------------------------------------------------
1 | package tv.danmaku.ijk.media.player.ffmpeg;
2 |
3 | public class FFmpegApi {
4 | public static native String av_base64_encode(byte in[]);
5 | }
6 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/misc/IMediaDataSource.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2015 Bilibili
3 | * Copyright (C) 2015 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player.misc;
19 |
20 | import java.io.IOException;
21 |
22 | @SuppressWarnings("RedundantThrows")
23 | public interface IMediaDataSource {
24 | int readAt(long position, byte[] buffer, int offset, int size) throws IOException;
25 |
26 | long getSize() throws IOException;
27 |
28 | void close() throws IOException;
29 | }
30 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/misc/IMediaFormat.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2015 Bilibili
3 | * Copyright (C) 2015 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 |
18 | package tv.danmaku.ijk.media.player.misc;
19 |
20 | public interface IMediaFormat {
21 | // Common keys
22 | String KEY_MIME = "mime";
23 |
24 | // Video Keys
25 | String KEY_WIDTH = "width";
26 | String KEY_HEIGHT = "height";
27 |
28 | String getString(String name);
29 |
30 | int getInteger(String name);
31 | }
32 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/pragma/Pragma.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2013 Bilibili
3 | * Copyright (C) 2013 Zhang Rui
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License");
6 | * you may not use this file except in compliance with the License.
7 | * You may obtain a copy of the License at
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software
12 | * distributed under the License is distributed on an "AS IS" BASIS,
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | * See the License for the specific language governing permissions and
15 | * limitations under the License.
16 | */
17 | package tv.danmaku.ijk.media.player.pragma;
18 |
19 | /*-
20 | * configurated by app project
21 | */
22 | public class Pragma {
23 | public static final boolean ENABLE_VERBOSE = true;
24 | }
25 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
12 |
13 | # Project target.
14 | target=android-22
15 | android.library=true
16 |
--------------------------------------------------------------------------------
/ijkplayer-java/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/image/home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/home.jpg
--------------------------------------------------------------------------------
/image/picture_audio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_audio.jpg
--------------------------------------------------------------------------------
/image/picture_circular_crop_new_style.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_circular_crop_new_style.jpg
--------------------------------------------------------------------------------
/image/picture_default_style_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_default_style_1.jpg
--------------------------------------------------------------------------------
/image/picture_default_style_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_default_style_2.jpg
--------------------------------------------------------------------------------
/image/picture_default_style_new_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_default_style_new_3.jpg
--------------------------------------------------------------------------------
/image/picture_framework_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_framework_cn.png
--------------------------------------------------------------------------------
/image/picture_framework_es.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_framework_es.png
--------------------------------------------------------------------------------
/image/picture_num_style_new_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_num_style_new_1.jpg
--------------------------------------------------------------------------------
/image/picture_num_style_new_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_num_style_new_2.jpg
--------------------------------------------------------------------------------
/image/picture_num_style_new_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_num_style_new_3.jpg
--------------------------------------------------------------------------------
/image/picture_sina_style_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_sina_style_1.jpg
--------------------------------------------------------------------------------
/image/picture_sina_style_new_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_sina_style_new_2.jpg
--------------------------------------------------------------------------------
/image/picture_sina_style_new_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_sina_style_new_3.jpg
--------------------------------------------------------------------------------
/image/picture_video.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_video.jpg
--------------------------------------------------------------------------------
/image/picture_wechat_album_style.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_wechat_album_style.jpg
--------------------------------------------------------------------------------
/image/picture_wechat_single_style_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_wechat_single_style_3.jpg
--------------------------------------------------------------------------------
/image/picture_wechat_style_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_wechat_style_1.jpg
--------------------------------------------------------------------------------
/image/picture_wechat_style_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_wechat_style_2.jpg
--------------------------------------------------------------------------------
/image/picture_wechat_style_new_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_wechat_style_new_3.jpg
--------------------------------------------------------------------------------
/image/picture_white_style.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/picture_white_style.jpeg
--------------------------------------------------------------------------------
/image/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/image/test.png
--------------------------------------------------------------------------------
/selector/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/selector/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/luck/Documents/android-sdk-macosx-2/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Uncomment this to preserve the line number information for
20 | # debugging stack traces.
21 | #-keepattributes SourceFile,LineNumberTable
22 |
23 | # If you keep the line number information, uncomment this to
24 | # hide the original source file name.
25 | #-renamesourcefileattribute SourceFile
26 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/animators/AlphaInAnimationAdapter.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.animators;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 | import androidx.recyclerview.widget.RecyclerView;
8 |
9 | /**
10 | * @author:luck
11 | * @date:2020-04-18 14:11
12 | * @describe:AlphaInAnimationAdapter
13 | */
14 | public class AlphaInAnimationAdapter extends BaseAnimationAdapter {
15 | private static final float DEFAULT_ALPHA_FROM = 0f;
16 | private final float mFrom;
17 |
18 | public AlphaInAnimationAdapter(RecyclerView.Adapter adapter) {
19 | this(adapter, DEFAULT_ALPHA_FROM);
20 | }
21 |
22 | public AlphaInAnimationAdapter(RecyclerView.Adapter adapter, float from) {
23 | super(adapter);
24 | mFrom = from;
25 | }
26 |
27 | @Override
28 | protected Animator[] getAnimators(View view) {
29 | return new Animator[]{ObjectAnimator.ofFloat(view, "alpha", mFrom, 1f)};
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/animators/AnimationType.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.animators;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-04-18 15:21
6 | * @describe:AnimationType
7 | */
8 | public class AnimationType {
9 |
10 | /**
11 | * default animation
12 | */
13 | public final static int DEFAULT_ANIMATION = -1;
14 |
15 | /**
16 | * alpha animation
17 | */
18 | public final static int ALPHA_IN_ANIMATION = 1;
19 | /**
20 | * slide in bottom animation
21 | */
22 | public final static int SLIDE_IN_BOTTOM_ANIMATION = 2;
23 | }
24 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/animators/SlideInBottomAnimationAdapter.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.animators;
2 |
3 | import android.animation.Animator;
4 | import android.animation.ObjectAnimator;
5 | import android.view.View;
6 |
7 | import androidx.recyclerview.widget.RecyclerView;
8 |
9 | /**
10 | * @author:luck
11 | * @date:2020-04-18 14:19
12 | * @describe:SlideInBottomAnimationAdapter
13 | */
14 | public class SlideInBottomAnimationAdapter extends BaseAnimationAdapter {
15 |
16 | public SlideInBottomAnimationAdapter(RecyclerView.Adapter adapter) {
17 | super(adapter);
18 | }
19 |
20 | @Override
21 | protected Animator[] getAnimators(View view) {
22 | return new Animator[]{
23 | ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0)
24 | };
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/animators/ViewHelper.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.animators;
2 |
3 | import android.view.View;
4 |
5 | import androidx.core.view.ViewCompat;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2020-04-18 14:13
10 | * @describe:ViewHelper
11 | */
12 | public final class ViewHelper {
13 | public static void clear(View v) {
14 | v.setAlpha(1);
15 | v.setScaleY(1);
16 | v.setScaleX(1);
17 | v.setTranslationY(0);
18 | v.setTranslationX(0);
19 | v.setRotation(0);
20 | v.setRotationY(0);
21 | v.setRotationX(0);
22 | v.setPivotY(v.getMeasuredHeight() / 2);
23 | v.setPivotX(v.getMeasuredWidth() / 2);
24 | ViewCompat.animate(v).setInterpolator(null).setStartDelay(0);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/app/IApp.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.app;
2 |
3 | import android.content.Context;
4 |
5 | import com.luck.picture.lib.engine.PictureSelectorEngine;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2019-12-03 15:14
10 | * @describe:IApp
11 | */
12 | public interface IApp {
13 | /**
14 | * Application
15 | *
16 | * @return
17 | */
18 | Context getAppContext();
19 |
20 | /**
21 | * PictureSelectorEngine
22 | *
23 | * @return
24 | */
25 | PictureSelectorEngine getPictureSelectorEngine();
26 | }
27 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/IBridgeLoaderFactory.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 | import com.luck.picture.lib.loader.IBridgeMediaLoader;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/6/10 9:37 上午
8 | * @describe:IBridgeLoaderFactory
9 | */
10 | public interface IBridgeLoaderFactory {
11 | /**
12 | * CreateLoader
13 | */
14 | IBridgeMediaLoader onCreateLoader();
15 | }
16 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/IBridgePictureBehavior.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/1/12 9:32 上午
6 | * @describe:IBridgePictureBehavior
7 | */
8 | public interface IBridgePictureBehavior {
9 | /**
10 | * finish activity
11 | *
12 | * @param result data
13 | */
14 | void onSelectFinish(PictureCommonFragment.SelectorResult result);
15 | }
16 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/IBridgeViewLifecycle.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 | import android.os.Bundle;
4 | import android.view.View;
5 |
6 | import androidx.fragment.app.Fragment;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2022/6/4 12:56 下午
11 | * @describe:IBridgeViewLifecycle
12 | */
13 | public interface IBridgeViewLifecycle {
14 | /**
15 | * onViewCreated
16 | *
17 | * @param fragment
18 | * @param view
19 | * @param savedInstanceState
20 | */
21 | void onViewCreated(Fragment fragment, View view, Bundle savedInstanceState);
22 |
23 | /**
24 | * onDestroy
25 | *
26 | * @param fragment
27 | */
28 | void onDestroy(Fragment fragment);
29 | }
30 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/IPictureSelectorEvent.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 |
4 | /**
5 | * @author:luck
6 | * @date:2021/11/18 8:35 下午
7 | * @describe:IPictureSelectorEvent
8 | */
9 | public interface IPictureSelectorEvent {
10 | /**
11 | * 获取相册目录
12 | */
13 | void loadAllAlbumData();
14 |
15 | /**
16 | * 获取首页资源
17 | */
18 | void loadFirstPageMediaData(long firstBucketId);
19 |
20 | /**
21 | * 加载应用沙盒内的资源
22 | */
23 | void loadOnlyInAppDirectoryAllMediaData();
24 |
25 | /**
26 | * 加载更多
27 | */
28 | void loadMoreMediaData();
29 | }
30 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/InterpolatorFactory.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 | import android.view.animation.Interpolator;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/6/20 6:01 下午
8 | * @describe:InterpolatorFactory
9 | */
10 | public interface InterpolatorFactory {
11 | /**
12 | * An interpolator defines the rate of change of an animation.
13 | * This allows the basic animation effects (alpha, scale, translate, rotate)
14 | * to be accelerated, decelerated, repeated, etc.
15 | */
16 | Interpolator newInterpolator();
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/basic/PictureFileProvider.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.basic;
2 |
3 | import androidx.core.content.FileProvider;
4 |
5 | /**
6 | * @author:luck
7 | * @data:2016/3/28 下午2:00
8 | * @描述: 自定义FileProvider 解决FileProvider冲突问题
9 | */
10 |
11 | public class PictureFileProvider extends FileProvider {
12 | }
13 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/config/FileSizeUnit.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.config;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/6/3 1:49 下午
6 | * @describe:文件大小单位
7 | */
8 | public final class FileSizeUnit {
9 | public static final long KB = 1024;
10 | public static final long MB = 1024 * 1024;
11 | public static final long GB = 1024 * 1024 * 1024;
12 |
13 | public static final int ACCURATE_GB = 1000 * 1000 * 1000;
14 | public static final int ACCURATE_MB = 1000 * 1000;
15 | public static final int ACCURATE_KB = 1000;
16 | }
17 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/config/PermissionEvent.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.config;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/3/25 1:41 下午
6 | * @describe:PermissionEvent
7 | */
8 | public class PermissionEvent {
9 | public static final int EVENT_SOURCE_DATA = -1;
10 | public static final int EVENT_SYSTEM_SOURCE_DATA = -2;
11 | public static final int EVENT_IMAGE_CAMERA = SelectMimeType.ofImage();
12 | public static final int EVENT_VIDEO_CAMERA = SelectMimeType.ofVideo();
13 | }
14 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/config/SelectLimitType.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.config;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/1/8 2:25 下午
6 | * @describe:SelectLimitType
7 | */
8 | public class SelectLimitType {
9 | public static final int SELECT_MAX_FILE_SIZE_LIMIT = 1;
10 | public static final int SELECT_MIN_FILE_SIZE_LIMIT = 2;
11 | public static final int SELECT_NOT_WITH_SELECT_LIMIT = 3;
12 | public static final int SELECT_MAX_SELECT_LIMIT = 4;
13 | public static final int SELECT_MIN_SELECT_LIMIT = 5;
14 | public static final int SELECT_MAX_VIDEO_SELECT_LIMIT = 6;
15 | public static final int SELECT_MIN_VIDEO_SELECT_LIMIT = 7;
16 | public static final int SELECT_MAX_VIDEO_SECOND_SELECT_LIMIT = 8;
17 | public static final int SELECT_MIN_VIDEO_SECOND_SELECT_LIMIT = 9;
18 | public static final int SELECT_MAX_AUDIO_SECOND_SELECT_LIMIT = 10;
19 | public static final int SELECT_MIN_AUDIO_SECOND_SELECT_LIMIT = 11;
20 | public static final int SELECT_MIN_AUDIO_SELECT_LIMIT = 12;
21 | public static final int SELECT_NOT_SUPPORT_SELECT_LIMIT = 13;
22 | }
23 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/config/SelectModeConfig.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.config;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/11/24 7:20 下午
6 | * @describe:SelectModeConfig
7 | */
8 | public class SelectModeConfig {
9 | /**
10 | * Radio mode
11 | */
12 | public final static int SINGLE = 1;
13 | /**
14 | * Multiple selection mode
15 | */
16 | public final static int MULTIPLE = 2;
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/config/VideoQuality.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.config;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/1/9 10:27 上午
6 | * @describe:VideoQuality
7 | */
8 | public class VideoQuality {
9 | public static final int VIDEO_QUALITY_LOW = 0;
10 | public static final int VIDEO_QUALITY_HIGH = 1;
11 | }
12 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/decoration/ViewPage2ItemDecoration.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.decoration;
2 |
3 | import android.graphics.Rect;
4 | import android.view.View;
5 |
6 | import androidx.annotation.NonNull;
7 | import androidx.recyclerview.widget.RecyclerView;
8 |
9 | /**
10 | * @author:luck
11 | * @data:2016/12/27 下午23:50
12 | * @describe:ViewPage2ItemDecoration
13 | */
14 |
15 | public class ViewPage2ItemDecoration extends RecyclerView.ItemDecoration {
16 |
17 | private final int spanCount;
18 | private final int spacing;
19 |
20 | public ViewPage2ItemDecoration(int spanCount, int spacing) {
21 | this.spanCount = spanCount;
22 | this.spacing = spacing;
23 | }
24 |
25 | @Override
26 | public void getItemOffsets(Rect outRect, @NonNull View view, RecyclerView parent, RecyclerView.State state) {
27 | int position = parent.getChildAdapterPosition(view);
28 | int column = position % spanCount;
29 | outRect.left = spacing - column * spacing / spanCount;
30 | outRect.right = (column + 1) * spacing / spanCount;
31 | }
32 | }
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/engine/CompressFileEngine.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.engine;
2 |
3 | import android.content.Context;
4 | import android.net.Uri;
5 |
6 | import com.luck.picture.lib.entity.LocalMedia;
7 | import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
8 |
9 | import java.util.ArrayList;
10 |
11 | /**
12 | * @author:luck
13 | * @date:2021/5/19 9:36 AM
14 | * @describe:CompressFileEngine
15 | */
16 | public interface CompressFileEngine {
17 | /**
18 | * Custom compression engine
19 | *
20 | * Users can implement this interface, and then access their own compression framework to plug
21 | * the compressed path into the {@link LocalMedia} object;
22 | *
23 | *
24 | * @param context
25 | * @param source
26 | */
27 | void onStartCompress(Context context, ArrayList source, OnKeyValueResultCallbackListener call);
28 | }
29 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/engine/UriToFileTransformEngine.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.engine;
2 |
3 | import android.content.Context;
4 |
5 | import com.luck.picture.lib.entity.LocalMedia;
6 | import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2021/11/23 8:23 下午
11 | * @describe:UriToFileTransformEngine
12 | */
13 | public interface UriToFileTransformEngine {
14 | /**
15 | * Custom Sandbox File engine
16 | *
17 | * Users can implement this interface, and then access their own sandbox framework to plug
18 | * the sandbox path into the {@link LocalMedia} object;
19 | *
20 | *
21 | * This is an asynchronous thread callback
22 | *
23 | *
24 | * @param context context
25 | * @param srcPath
26 | * @param mineType
27 | */
28 | void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call);
29 | }
30 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/entity/MediaData.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.entity;
2 |
3 | import java.util.ArrayList;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-04-17 13:52
8 | * @describe:MediaData
9 | */
10 | public class MediaData {
11 |
12 | /**
13 | * Is there more
14 | */
15 | public boolean isHasNextMore;
16 |
17 | /**
18 | * data
19 | */
20 | public ArrayList data;
21 |
22 |
23 | public MediaData() {
24 | super();
25 | }
26 |
27 | public MediaData(boolean isHasNextMore, ArrayList data) {
28 | super();
29 | this.isHasNextMore = isHasNextMore;
30 | this.data = data;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnAlbumItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import com.luck.picture.lib.entity.LocalMediaFolder;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/11/18 7:50 下午
8 | * @describe:OnAlbumItemClickListener
9 | */
10 | public interface OnAlbumItemClickListener {
11 | /**
12 | * 专辑列表点击事件
13 | *
14 | * @param position 下标
15 | * @param curFolder 当前相册
16 | */
17 | void onItemClick(int position, LocalMediaFolder curFolder);
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnBitmapWatermarkEventListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/4/2 4:37 下午
8 | * @describe:OnBitmapWatermarkEventListener
9 | */
10 | public interface OnBitmapWatermarkEventListener {
11 | /**
12 | * Add bitmap watermark
13 | *
14 | * @param context
15 | * @param srcPath
16 | * @param mimeType
17 | */
18 | void onAddBitmapWatermark(Context context, String srcPath, String mimeType, OnKeyValueResultCallbackListener call);
19 | }
20 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnCallbackIndexListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020/4/24 11:48 AM
6 | * @describe:OnCallbackIndexListener
7 | */
8 | public interface OnCallbackIndexListener {
9 | /**
10 | * @param data
11 | * @param index
12 | */
13 | void onCall(T data, int index);
14 | }
15 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnCallbackListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020/4/24 11:48 AM
6 | * @describe:OnCallbackListener
7 | */
8 | public interface OnCallbackListener {
9 | /**
10 | * @param data
11 | */
12 | void onCall(T data);
13 | }
14 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnCameraInterceptListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import androidx.fragment.app.Fragment;
4 |
5 | import com.luck.picture.lib.config.SelectMimeType;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2021/11/23 10:41 上午
10 | * @describe:OnCameraInterceptListener
11 | */
12 | public interface OnCameraInterceptListener {
13 |
14 | /**
15 | * Intercept camera click events, and users can implement their own camera framework
16 | *
17 | * @param fragment fragment Fragment to receive result
18 | * @param cameraMode Camera mode
19 | * {@link SelectMimeType.ofImage(),ofVideo()}
20 | *
21 | * If you use your own camera, you need to put the result URL
22 | * Intent.putExtra(MediaStore.EXTRA_OUTPUT, URI) after taking photos
23 | *
24 | * @param requestCode requestCode for result
25 | */
26 | void openCamera(Fragment fragment, int cameraMode, int requestCode);
27 | }
28 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnCustomLoadingListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.app.Dialog;
4 | import android.content.Context;
5 |
6 | /**
7 | * @author:luck
8 | * @date:2022/8/12 7:19 下午
9 | * @describe:OnCustomLoadingListener
10 | */
11 | public interface OnCustomLoadingListener {
12 | /**
13 | * create loading dialog
14 | *
15 | * @param context
16 | */
17 | Dialog create(Context context);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnExternalPreviewEventListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.content.Context;
4 |
5 | import com.luck.picture.lib.entity.LocalMedia;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2021/11/24 7:30 下午
10 | * @describe:OnExternalPreviewEventListener
11 | */
12 | public interface OnExternalPreviewEventListener {
13 | /**
14 | * 删除图片
15 | *
16 | * @param position 删除的下标
17 | */
18 | void onPreviewDelete(int position);
19 |
20 | /**
21 | * 长按下载
22 | *
23 | * @param media 资源
24 | * @return true 自己实现下载逻辑;默认false
25 | */
26 | boolean onLongPressDownload(Context context, LocalMedia media);
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnGridItemSelectAnimListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/6/26 2:51 下午
8 | * @describe:OnGridItemSelectAnimListener
9 | */
10 | public interface OnGridItemSelectAnimListener {
11 | /**
12 | * onSelectItemAnim
13 | *
14 | * @param view
15 | * @param isSelected
16 | */
17 | void onSelectItemAnim(View view, boolean isSelected);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnInjectActivityPreviewListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import com.luck.picture.lib.PictureSelectorPreviewFragment;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/6/26 8:21 上午
8 | * @describe:OnInjectActivityPreviewListener
9 | */
10 | public interface OnInjectActivityPreviewListener {
11 | /**
12 | * onInjectPreviewFragment
13 | */
14 | PictureSelectorPreviewFragment onInjectPreviewFragment();
15 | }
16 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-03-26 10:50
8 | * @describe:OnItemClickListener
9 | */
10 | public interface OnItemClickListener {
11 | /**
12 | * Item click event
13 | *
14 | * @param v
15 | * @param position
16 | */
17 | void onItemClick(View v, int position);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnKeyValueResultCallbackListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020/4/24 11:48 AM
6 | * @describe:OnKeyValueResultCallbackListener
7 | */
8 | public interface OnKeyValueResultCallbackListener {
9 | /**
10 | * @param srcPath
11 | * @param resultPath
12 | */
13 | void onCallback(String srcPath, String resultPath);
14 | }
15 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnPermissionDeniedListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import androidx.fragment.app.Fragment;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/3/15 8:33 下午
8 | * @describe:OnPermissionDeniedListener
9 | */
10 | public interface OnPermissionDeniedListener {
11 | /**
12 | * Permission denied
13 | *
14 | * @param permissionArray Permission
15 | * @param requestCode Jump to the {@link .startActivityForResult # requestCode} used in system settings
16 | * @param call if call.onCall(true);Can follow internal logic,Otherwise, press the user's own
17 | */
18 | void onDenied(Fragment fragment, String[] permissionArray, int requestCode, OnCallbackListener call);
19 | }
20 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnPermissionDescriptionListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import androidx.fragment.app.Fragment;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/12/1 8:48 下午
8 | * @describe:OnPermissionDescriptionListener
9 | */
10 | public interface OnPermissionDescriptionListener {
11 | /**
12 | * Permission description
13 | *
14 | * @param fragment
15 | * @param permissionArray
16 | */
17 | void onPermissionDescription(Fragment fragment, String[] permissionArray);
18 |
19 | /**
20 | * onDismiss
21 | */
22 | void onDismiss(Fragment fragment);
23 | }
24 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnPermissionsInterceptListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import androidx.fragment.app.Fragment;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/12/1 8:48 下午
8 | * @describe:OnPermissionsInterceptListener
9 | */
10 | public interface OnPermissionsInterceptListener {
11 | /**
12 | * Custom Permissions management
13 | *
14 | * @param fragment
15 | * @param permissionArray Permissions array
16 | * @param call
17 | */
18 | void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call);
19 |
20 | /**
21 | * Verify permission application status
22 | *
23 | * @param fragment
24 | * @param permissionArray
25 | * @return
26 | */
27 | boolean hasPermissions(Fragment fragment, String[] permissionArray);
28 | }
29 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnPlayerListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2022/7/1 23:25 下午
6 | * @describe:OnPlayerListener
7 | */
8 | public interface OnPlayerListener {
9 | /**
10 | * player error
11 | */
12 | void onPlayerError();
13 |
14 | /**
15 | * playing
16 | */
17 | void onPlayerReady();
18 |
19 | /**
20 | * preparing to play
21 | */
22 | void onPlayerLoading();
23 |
24 | /**
25 | * end of playback
26 | */
27 | void onPlayerEnd();
28 | }
29 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnQueryAlbumListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/12/5 9:56 下午
6 | * @describe:OnExternalQueryAlbumListener
7 | */
8 | public interface OnQueryAlbumListener {
9 | void onComplete(T result);
10 | }
11 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnQueryAllAlbumListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/12/5 9:41 下午
8 | * @describe:OnExternalQueryAllAlbumListener
9 | */
10 | public interface OnQueryAllAlbumListener {
11 |
12 | void onComplete(List result);
13 | }
14 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnQueryDataResultListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import java.util.ArrayList;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-04-16 12:42
8 | * @describe:OnQueryMediaResultListener
9 | */
10 | public class OnQueryDataResultListener {
11 | /**
12 | * Query to complete The callback listener
13 | *
14 | * @param result The data source
15 | * @param isHasMore Is there more
16 | */
17 | public void onComplete(ArrayList result, boolean isHasMore) {
18 |
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnQueryDataSourceListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-04-16 12:42
8 | * @describe:OnQueryDataSourceListener
9 | */
10 | public interface OnQueryDataSourceListener {
11 | /**
12 | * Query data source
13 | *
14 | * @param result The data source
15 | */
16 | void onComplete(List result);
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnQueryFilterListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import com.luck.picture.lib.entity.LocalMedia;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/3/12 10:09 上午
8 | * @describe:OnQueryFilterListener
9 | */
10 | public interface OnQueryFilterListener {
11 | /**
12 | * You need to filter out what doesn't meet the standards
13 | *
14 | * @return the boolean result
15 | */
16 | boolean onFilter(LocalMedia media);
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnRecordAudioInterceptListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import androidx.fragment.app.Fragment;
4 |
5 | import com.luck.picture.lib.config.SelectMimeType;
6 |
7 | /**
8 | * @author:luck
9 | * @date:2022/3/18 2:55 下午
10 | * @describe:OnRecordAudioInterceptListener
11 | */
12 | public interface OnRecordAudioInterceptListener {
13 | /**
14 | * Intercept record audio click events, and users can implement their own record audio framework
15 | *
16 | * @param fragment fragment Fragment to receive result
17 | * @param requestCode requestCode for result
18 | *
19 | * {@link SelectMimeType.ofAudio()}
20 | *
21 | * If you use your own camera, you need to put the result URL
22 | * Intent.putExtra(MediaStore.EXTRA_OUTPUT, URI) after taking photos
23 | *
24 | */
25 | void onRecordAudio(Fragment fragment, int requestCode);
26 | }
27 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnRecyclerViewPreloadMoreListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-04-14 18:44
6 | * @describe:OnRecyclerViewPreloadMoreListener
7 | */
8 | public interface OnRecyclerViewPreloadMoreListener {
9 | /**
10 | * load more
11 | */
12 | void onRecyclerViewPreloadMore();
13 | }
14 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnRecyclerViewScrollStateListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020-04-14 18:44
6 | * @describe:OnRecyclerViewScrollStateListener
7 | */
8 | public interface OnRecyclerViewScrollStateListener {
9 |
10 | /**
11 | * RecyclerView Scroll Fast
12 | */
13 | void onScrollFast();
14 |
15 | /**
16 | * RecyclerView Scroll Slow
17 | */
18 | void onScrollSlow();
19 | }
20 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnRequestPermissionListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2020/4/24 11:48 AM
6 | * @describe:OnRequestPermissionListener
7 | */
8 | public interface OnRequestPermissionListener {
9 | /**
10 | * Permission request result
11 | *
12 | * @param permissionArray
13 | * @param isResult
14 | */
15 | void onCall(String[] permissionArray, boolean isResult);
16 | }
17 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnResultCallbackListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import java.util.ArrayList;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2020-01-14 17:08
8 | * @describe:onResult Callback Listener
9 | */
10 | public interface OnResultCallbackListener {
11 | /**
12 | * return LocalMedia result
13 | *
14 | * @param result
15 | */
16 | void onResult(ArrayList result);
17 |
18 | /**
19 | * Cancel
20 | */
21 | void onCancel();
22 | }
23 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnSelectAnimListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/6/26 2:51 下午
8 | * @describe:OnSelectAnimListener
9 | */
10 | public interface OnSelectAnimListener {
11 | /**
12 | * onSelectAnim
13 | *
14 | * @param view
15 | * @return anim duration
16 | */
17 | long onSelectAnim(View view);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnSelectFilterListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import com.luck.picture.lib.entity.LocalMedia;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/3/12 9:00 下午
8 | * @describe:OnSelectFilterListener
9 | */
10 | public interface OnSelectFilterListener {
11 | /**
12 | * You need to filter out the content that does not meet the selection criteria
13 | *
14 | * @param media current select {@link LocalMedia}
15 | * @return the boolean result
16 | */
17 | boolean onSelectFilter(LocalMedia media);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnSelectLimitTipsListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.annotation.Nullable;
6 |
7 | import com.luck.picture.lib.config.SelectorConfig;
8 | import com.luck.picture.lib.config.SelectLimitType;
9 | import com.luck.picture.lib.entity.LocalMedia;
10 |
11 | /**
12 | * @author:luck
13 | * @date:2022/1/8 2:12 下午
14 | * @describe:OnSelectLimitTipsListener
15 | */
16 | public interface OnSelectLimitTipsListener {
17 | /**
18 | * Custom limit tips
19 | *
20 | * @param media Current Selection {@link LocalMedia}
21 | * @param config PictureSelectionConfig
22 | * @param limitType Use {@link SelectLimitType}
23 | * @return If true is returned, the user needs to customize the implementation prompt content,
24 | * Otherwise, use the system default prompt
25 | */
26 | boolean onSelectLimitTips(Context context, @Nullable LocalMedia media, SelectorConfig config, int limitType);
27 | }
28 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/interfaces/OnVideoThumbnailEventListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.interfaces;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2022/4/3 5:37 下午
8 | * @describe:OnVideoThumbnailEventListener
9 | */
10 | public interface OnVideoThumbnailEventListener {
11 | /**
12 | * video thumbnail
13 | *
14 | * @param context
15 | * @param videoPath
16 | */
17 | void onVideoThumbnail(Context context, String videoPath, OnKeyValueResultCallbackListener call);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/magical/OnMagicalViewCallback.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.magical;
2 |
3 |
4 | /**
5 | * @author:luck
6 | * @date:2021/12/15 11:06 上午
7 | * @describe:OnMagicalViewCallback
8 | */
9 | public interface OnMagicalViewCallback {
10 |
11 | void onBeginBackMinAnim();
12 |
13 | void onBeginBackMinMagicalFinish(boolean isResetSize);
14 |
15 | void onBeginMagicalAnimComplete(MagicalView mojitoView, boolean showImmediately);
16 |
17 | void onBackgroundAlpha(float alpha);
18 |
19 | void onMagicalViewFinish();
20 | }
21 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/manager/SelectedManager.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.manager;
2 |
3 |
4 | /**
5 | * @author:luck
6 | * @date:2021/11/20 8:57 下午
7 | * @describe:SelectedManager
8 | */
9 | public final class SelectedManager {
10 | public static final int INVALID = -1;
11 | public static final int ADD_SUCCESS = 0;
12 | public static final int REMOVE = 1;
13 | public static final int SUCCESS = 200;
14 | }
15 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/permissions/PermissionResultCallback.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.permissions;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/11/18 10:15 上午
6 | * @describe:PermissionResultCallback
7 | */
8 | public interface PermissionResultCallback {
9 |
10 | void onGranted();
11 |
12 | void onDenied();
13 | }
14 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/Compat.java:
--------------------------------------------------------------------------------
1 |
2 | package com.luck.picture.lib.photoview;
3 |
4 | import android.annotation.TargetApi;
5 | import android.view.View;
6 |
7 | class Compat {
8 |
9 | public static void postOnAnimation(View view, Runnable runnable) {
10 | postOnAnimationJellyBean(view, runnable);
11 | }
12 |
13 | @TargetApi(16)
14 | private static void postOnAnimationJellyBean(View view, Runnable runnable) {
15 | view.postOnAnimation(runnable);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnGestureListener.java:
--------------------------------------------------------------------------------
1 |
2 | package com.luck.picture.lib.photoview;
3 |
4 | interface OnGestureListener {
5 |
6 | void onDrag(float dx, float dy);
7 |
8 | void onFling(float startX, float startY, float velocityX,
9 | float velocityY);
10 |
11 | void onScale(float scaleFactor, float focusX, float focusY);
12 |
13 | void onScale(float scaleFactor, float focusX, float focusY, float dx, float dy);
14 | }
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnMatrixChangedListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | import android.graphics.RectF;
4 |
5 | /**
6 | * Interface definition for a callback to be invoked when the internal Matrix has changed for
7 | * this View.
8 | */
9 | public interface OnMatrixChangedListener {
10 |
11 | /**
12 | * Callback for when the Matrix displaying the Drawable has changed. This could be because
13 | * the View's bounds have changed, or the user has zoomed.
14 | *
15 | * @param rect - Rectangle displaying the Drawable's new bounds.
16 | */
17 | void onMatrixChanged(RectF rect);
18 | }
19 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnOutsidePhotoTapListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | import android.widget.ImageView;
4 |
5 | /**
6 | * Callback when the user tapped outside of the photo
7 | */
8 | public interface OnOutsidePhotoTapListener {
9 |
10 | /**
11 | * The outside of the photo has been tapped
12 | */
13 | void onOutsidePhotoTap(ImageView imageView);
14 | }
15 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnPhotoTapListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | import android.widget.ImageView;
4 |
5 | /**
6 | * A callback to be invoked when the Photo is tapped with a single
7 | * tap.
8 | */
9 | public interface OnPhotoTapListener {
10 |
11 | /**
12 | * A callback to receive where the user taps on a photo. You will only receive a callback if
13 | * the user taps on the actual photo, tapping on 'whitespace' will be ignored.
14 | *
15 | * @param view ImageView the user tapped.
16 | * @param x where the user tapped from the of the Drawable, as percentage of the
17 | * Drawable width.
18 | * @param y where the user tapped from the top of the Drawable, as percentage of the
19 | * Drawable height.
20 | */
21 | void onPhotoTap(ImageView view, float x, float y);
22 | }
23 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnScaleChangedListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 |
4 | /**
5 | * Interface definition for callback to be invoked when attached ImageView scale changes
6 | */
7 | public interface OnScaleChangedListener {
8 |
9 | /**
10 | * Callback for when the scale changes
11 | *
12 | * @param scaleFactor the scale factor (less than 1 for zoom out, greater than 1 for zoom in)
13 | * @param focusX focal point X position
14 | * @param focusY focal point Y position
15 | */
16 | void onScaleChange(float scaleFactor, float focusX, float focusY);
17 | }
18 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnSingleFlingListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | import android.view.MotionEvent;
4 |
5 | /**
6 | * A callback to be invoked when the ImageView is flung with a single
7 | * touch
8 | */
9 | public interface OnSingleFlingListener {
10 |
11 | /**
12 | * A callback to receive where the user flings on a ImageView. You will receive a callback if
13 | * the user flings anywhere on the view.
14 | *
15 | * @param e1 MotionEvent the user first touch.
16 | * @param e2 MotionEvent the user last touch.
17 | * @param velocityX distance of user's horizontal fling.
18 | * @param velocityY distance of user's vertical fling.
19 | */
20 | boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
21 | }
22 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnViewDragListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | /**
4 | * Interface definition for a callback to be invoked when the photo is experiencing a drag event
5 | */
6 | public interface OnViewDragListener {
7 |
8 | /**
9 | * Callback for when the photo is experiencing a drag event. This cannot be invoked when the
10 | * user is scaling.
11 | *
12 | * @param dx The change of the coordinates in the x-direction
13 | * @param dy The change of the coordinates in the y-direction
14 | */
15 | void onDrag(float dx, float dy);
16 | }
17 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/photoview/OnViewTapListener.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.photoview;
2 |
3 | import android.view.View;
4 |
5 | public interface OnViewTapListener {
6 |
7 | /**
8 | * A callback to receive where the user taps on a ImageView. You will receive a callback if
9 | * the user taps anywhere on the view, tapping on 'whitespace' will not be ignored.
10 | *
11 | * @param view - View the user tapped.
12 | * @param x - where the user tapped from the left of the View.
13 | * @param y - where the user tapped from the top of the View.
14 | */
15 | void onViewTap(View view, float x, float y);
16 | }
17 |
--------------------------------------------------------------------------------
/selector/src/main/java/com/luck/picture/lib/utils/DoubleUtils.java:
--------------------------------------------------------------------------------
1 | package com.luck.picture.lib.utils;
2 |
3 | import android.os.SystemClock;
4 |
5 | /**
6 | * @author:luck
7 | * @date:2021/12/10 10:07 上午
8 | * @describe:DoubleUtils
9 | */
10 | public class DoubleUtils {
11 | private final static long TIME = 600;
12 |
13 | private static long lastClickTime;
14 |
15 | public static boolean isFastDoubleClick() {
16 | long time = SystemClock.elapsedRealtime();
17 | if (time - lastClickTime < TIME) {
18 | return true;
19 | }
20 | lastClickTime = time;
21 | return false;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_album_dismiss.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
12 |
13 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_album_show.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
11 |
12 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_alpha_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_alpha_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_anticipate_interpolator.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_down_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
12 |
16 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
12 |
16 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_fade_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_fade_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_fall_enter.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
11 |
19 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_layout_fall_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_modal_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
14 |
18 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_overshoot_interpolator.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/selector/src/main/res/anim/ps_anim_up_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_audio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_audio.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_placeholder.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_play.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_play_cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_play_cover.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_stop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_audio_stop.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_back.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_black_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_black_back.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_camera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_camera.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_default_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_default_arrow.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_delete.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_editor.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_fast_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_fast_play.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_grey_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_grey_arrow.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_no_data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_no_data.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_normal.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_normal_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_normal_back.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_placeholder.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_preview_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_preview_selected.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_progress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_progress.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_seek_bar_thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_seek_bar_thumb.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_selected.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_shadow_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_shadow_bg.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_slow_audio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_slow_audio.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_trans_1px.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_trans_1px.9.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_video.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_video.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable-xxhdpi/ps_ic_video_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/drawable-xxhdpi/ps_ic_video_play.png
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_album_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_anim_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_audio_placeholder.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
8 |
9 |
10 |
11 | -
12 |
15 |
16 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_left_bottom_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_left_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_left_select.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_right_bottom_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_right_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_right_select.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_btn_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_cancel_default_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_checkbox_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_default_num_oval_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
13 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_default_num_oval_selected.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_default_num_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_dialog_loading_bg.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_dialog_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_gif_tag.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
11 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_image_placeholder.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
8 |
9 |
10 |
11 | -
12 |
15 |
16 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_item_select_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_layer_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
8 |
9 | -
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_num_oval.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
9 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_orange_oval.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
10 |
13 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_original_checkbox.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_original_wechat_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_original_wechat_selected.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
7 |
10 |
11 |
12 |
15 |
16 |
17 |
18 | -
23 |
26 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_preview_checkbox_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_preview_gallery_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
7 |
8 |
9 |
12 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_preview_gallery_frame.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_seek_bar_thumb_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_seek_bar_thumb_pressed.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_select_complete_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_select_complete_normal_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_transparent_space.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_view_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/drawable/ps_view_press.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_activity_container.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_alert_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_complete_selected_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
16 |
17 |
26 |
27 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_custom_preview_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_empty.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_item_grid_camera.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
19 |
20 |
--------------------------------------------------------------------------------
/selector/src/main/res/layout/ps_preview_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/selector/src/main/res/raw/ps_click_music.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/selector/src/main/res/raw/ps_click_music.wav
--------------------------------------------------------------------------------
/selector/src/main/res/xml/ps_file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':selector',':ucrop',':compress'
2 | include ':camerax'
3 | include ':ijkplayer-java'
4 |
--------------------------------------------------------------------------------
/ucrop/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/ucrop/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=uCrop
2 | POM_ARTIFACT_ID=ucrop
3 | POM_PACKAGING=aar
--------------------------------------------------------------------------------
/ucrop/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/oleksii/Library/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/ucrop/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
13 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/OkHttpClientStore.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | import okhttp3.OkHttpClient;
6 |
7 | public class OkHttpClientStore {
8 |
9 | private OkHttpClientStore() {}
10 |
11 | public final static OkHttpClientStore INSTANCE = new OkHttpClientStore();
12 |
13 | private OkHttpClient client;
14 |
15 | /**
16 | * @return stored OkHttpClient if it was already set,
17 | * or just an instance created via empty constructor
18 | * and store it
19 | */
20 | @NonNull
21 | public OkHttpClient getClient() {
22 | if (client == null) {
23 | client = new OkHttpClient();
24 | }
25 | return client;
26 | }
27 |
28 | /**
29 | * @param client OkHttpClient for downloading bitmap form remote Uri,
30 | * it may contain any preferences you need
31 | */
32 | void setClient(@NonNull OkHttpClient client) {
33 | this.client = client;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/UCropDevelopConfig.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/12/2 10:23 上午
6 | * @describe:UCropDevelopConfig
7 | */
8 | public final class UCropDevelopConfig {
9 | /**
10 | * 图片加载引擎
11 | */
12 | public static UCropImageEngine imageEngine;
13 |
14 | /**
15 | * 释放监听器
16 | */
17 | public static void destroy() {
18 | UCropDevelopConfig.imageEngine = null;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/UCropFragmentCallback.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop;
2 |
3 | public interface UCropFragmentCallback {
4 |
5 | /**
6 | * Return loader status
7 | * @param showLoader
8 | */
9 | void loadingProgress(boolean showLoader);
10 |
11 | /**
12 | * Return cropping result or error
13 | * @param result
14 | */
15 | void onCropFinish(UCropFragment.UCropResult result);
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/UCropImageEngine.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import android.net.Uri;
6 | import android.widget.ImageView;
7 |
8 | /**
9 | * @author:luck
10 | * @date:2021/12/1 9:53 下午
11 | * @describe:UCropImageEngine
12 | */
13 | public interface UCropImageEngine {
14 | /**
15 | * load image source
16 | *
17 | * @param context
18 | * @param url
19 | * @param imageView
20 | */
21 | void loadImage(Context context, String url, ImageView imageView);
22 |
23 | /**
24 | * load image source
25 | *
26 | * @param context
27 | * @param url
28 | * @param maxWidth
29 | * @param maxHeight
30 | * @param call
31 | */
32 | void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call);
33 |
34 |
35 | interface OnCallbackListener {
36 | /**
37 | * @param data
38 | */
39 | void onCall(T data);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/callback/BitmapCropCallback.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.callback;
2 |
3 | import android.net.Uri;
4 |
5 | import androidx.annotation.NonNull;
6 |
7 | public interface BitmapCropCallback {
8 |
9 | void onBitmapCropped(@NonNull Uri resultUri, int offsetX, int offsetY, int imageWidth, int imageHeight);
10 |
11 | void onCropFailure(@NonNull Throwable t);
12 |
13 | }
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/callback/BitmapLoadCallback.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.callback;
2 |
3 | import android.graphics.Bitmap;
4 | import android.net.Uri;
5 |
6 | import androidx.annotation.NonNull;
7 | import androidx.annotation.Nullable;
8 |
9 | import com.yalantis.ucrop.model.ExifInfo;
10 |
11 | public interface BitmapLoadCallback {
12 |
13 | void onBitmapLoaded(@NonNull Bitmap bitmap, @NonNull ExifInfo exifInfo, @NonNull Uri imageInputUri, @Nullable Uri imageOutputUri);
14 |
15 | void onFailure(@NonNull Exception bitmapWorkerException);
16 |
17 | }
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/callback/CropBoundsChangeListener.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.callback;
2 |
3 | /**
4 | * Interface for crop bound change notifying.
5 | */
6 | public interface CropBoundsChangeListener {
7 |
8 | void onCropAspectRatioChanged(float cropRatio);
9 |
10 | }
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/callback/OverlayViewChangeListener.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.callback;
2 |
3 | import android.graphics.RectF;
4 |
5 | /**
6 | * Created by Oleksii Shliama.
7 | */
8 | public interface OverlayViewChangeListener {
9 |
10 | void onCropRectUpdated(RectF cropRect);
11 |
12 | void postTranslate(float deltaX, float deltaY);
13 | }
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/model/CustomIntentKey.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.model;
2 |
3 | /**
4 | * @author:luck
5 | * @date:2021/12/1 6:49 下午
6 | * @describe:CustomIntentKey
7 | */
8 | public class CustomIntentKey {
9 | /**
10 | * 输出的路径
11 | */
12 | public static final String EXTRA_OUT_PUT_PATH = "outPutPath";
13 | /**
14 | * 图片宽度
15 | */
16 | public static final String EXTRA_IMAGE_WIDTH = "imageWidth";
17 | /**
18 | * 图片高度
19 | */
20 | public static final String EXTRA_IMAGE_HEIGHT = "imageHeight";
21 | /**
22 | * 图片X轴偏移量
23 | */
24 | public static final String EXTRA_OFFSET_X = "offsetX";
25 | /**
26 | * 图片Y轴偏移量
27 | */
28 | public static final String EXTRA_OFFSET_Y = "offsetY";
29 | /**
30 | * 图片旋转比例
31 | */
32 | public static final String EXTRA_ASPECT_RATIO = "aspectRatio";
33 | }
34 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/model/ImageState.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.model;
2 |
3 | import android.graphics.RectF;
4 |
5 | /**
6 | * Created by Oleksii Shliama [https://github.com/shliama] on 6/21/16.
7 | */
8 | public class ImageState {
9 |
10 | private RectF mCropRect;
11 | private RectF mCurrentImageRect;
12 |
13 | private float mCurrentScale, mCurrentAngle;
14 |
15 | public ImageState(RectF cropRect, RectF currentImageRect, float currentScale, float currentAngle) {
16 | mCropRect = cropRect;
17 | mCurrentImageRect = currentImageRect;
18 | mCurrentScale = currentScale;
19 | mCurrentAngle = currentAngle;
20 | }
21 |
22 | public RectF getCropRect() {
23 | return mCropRect;
24 | }
25 |
26 | public RectF getCurrentImageRect() {
27 | return mCurrentImageRect;
28 | }
29 |
30 | public float getCurrentScale() {
31 | return mCurrentScale;
32 | }
33 |
34 | public float getCurrentAngle() {
35 | return mCurrentAngle;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/util/CubicEasing.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.util;
2 |
3 | public final class CubicEasing {
4 |
5 | public static float easeOut(float time, float start, float end, float duration) {
6 | return end * ((time = time / duration - 1.0f) * time * time + 1.0f) + start;
7 | }
8 |
9 | public static float easeIn(float time, float start, float end, float duration) {
10 | return end * (time /= duration) * time * time + start;
11 | }
12 |
13 | public static float easeInOut(float time, float start, float end, float duration) {
14 | return (time /= duration / 2.0f) < 1.0f ? end / 2.0f * time * time * time + start : end / 2.0f * ((time -= 2.0f) * time * time + 2.0f) + start;
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/ucrop/src/main/java/com/yalantis/ucrop/util/DensityUtil.java:
--------------------------------------------------------------------------------
1 | package com.yalantis.ucrop.util;
2 |
3 | import android.content.Context;
4 | import android.content.res.Resources;
5 |
6 | /**
7 | * @author:luck
8 | * @date:2021/11/17 11:48 上午
9 | * @describe:DensityUtil
10 | */
11 | public class DensityUtil {
12 | /**
13 | * dp2px
14 | */
15 | public static int dip2px(Context context, float dpValue) {
16 | final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density;
17 | return (int) (dpValue * scale + 0.5f);
18 | }
19 |
20 | /**
21 | * 获取状态栏高度
22 | */
23 | public static int getStatusBarHeight(Context context) {
24 | int result = 0;
25 | int resourceId = Resources.getSystem().getIdentifier("status_bar_height", "dimen", "android");
26 | if (resourceId > 0) {
27 | result = context.getResources().getDimensionPixelSize(resourceId);
28 | }
29 | return result == 0 ? dip2px(context, 26) : result;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/anim/ucrop_item_animation_fall_down.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
11 |
19 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/anim/ucrop_layout_animation_fall_down.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/anim/ucrop_loader_circle_path.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
19 |
20 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/anim/ucrop_loader_circle_scale.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
19 |
20 |
27 |
28 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/color/ucrop_scale_text_view_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-hdpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-hdpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-hdpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-hdpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-ldpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-ldpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-ldpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-ldpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-mdpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-mdpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-mdpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-mdpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xhdpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xhdpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xhdpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xhdpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xxhdpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xxhdpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xxhdpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xxhdpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xxxhdpi/ucrop_ic_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xxxhdpi/ucrop_ic_angle.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable-xxxhdpi/ucrop_ic_done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/ucrop/src/main/res/drawable-xxxhdpi/ucrop_ic_done.png
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_crop.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_gallery_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
7 |
8 |
9 |
12 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_gallery_current.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_crop.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_crop_unselected.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_cross.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_next.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_reset.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_rotate.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_rotate_unselected.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_scale.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_ic_scale_unselected.xml:
--------------------------------------------------------------------------------
1 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_rotate.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_scale.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_shadow_upside.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_vector_ic_crop.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_vector_loader.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_vector_loader_animated.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/drawable/ucrop_wrapper_controls_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/layout/ucrop_aspect_ratio.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/layout/ucrop_gallery_adapter_item.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
10 |
11 |
18 |
19 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/layout/ucrop_layout_scale_wheel.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
19 |
20 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/layout/ucrop_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
13 |
14 |
19 |
20 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/menu/ucrop_menu_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-ar-rAE/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | غزل
4 | نسبة
5 | قطع
6 |
7 | النسبة الأصلية
8 | قطع
9 |
10 | قطع
11 | الصور المتحركة
12 | نوع القص غير معتمد
13 |
14 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-de-rDE/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Foto editieren
4 | Original
5 | Zuschneiden
6 | Bewegen
7 | Nicht unterstützter Schnitttyp
8 |
9 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-en-rUS/string.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Original
5 | Edit Photo
6 |
7 | Crop
8 |
9 | Rotate
10 | Scale
11 | Crop
12 |
13 | gif
14 | not supported crop type
15 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-es-rES/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Girar
5 | Proporción
6 | Recortar
7 |
8 | Normas
9 | Recortar
10 |
11 | Recortar
12 | Gif
13 | Tipos de Corte no soportados
14 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-fr-rFR/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Original
4 | Modifier la photo
5 | Recadrer
6 | Bouge fig
7 | Type de coupe non pris en charge
8 |
9 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-ja-rJP/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 元の比率
4 | 切り取り
5 |
6 | 切り取り
7 | gif図
8 | サポートされていないクリップタイプ
9 |
10 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-ko-rKR/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 사진 편집
4 | 원본
5 | 확인
6 | 움직이
7 | 지원되지 않는 잘라내기 유형
8 |
9 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-pt-rPT/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Rotação
5 | Proporção
6 | Recorte
7 |
8 | Norma
9 | Recorte
10 |
11 | Recorte
12 | Gif
13 | Tipo de corte não suportado
14 |
15 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-ru-rRU/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | вращение
4 | масштаб
5 | кроить
6 |
7 | масштаб
8 | кроить
9 |
10 | кроить
11 | gif
12 |
13 | Неподдерживаемый тип вырезки
14 |
15 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-vi-rVN/string.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | gif
5 | Editar foto
6 | Original
7 | Recortar
8 | Kiểu cắt chưa sắp xếp
9 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 旋转
4 | 比例
5 | 裁剪
6 |
7 | 原始比例
8 | 裁剪
9 |
10 | 裁剪
11 | 动图
12 |
13 | 不支持的裁剪类型
14 |
15 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values-zh-rTW/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 原始比例
4 | 裁切
5 |
6 | 裁切
7 |
8 | 動圖
9 | 不支持的裁剪類型
10 |
11 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values/public.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | gif
3 | Original
4 | Edit Photo
5 |
6 | Crop
7 |
8 | Both input and output Uri must be specified
9 | Therefore, override color resource (ucrop_color_toolbar_widget) in your app to make it work on pre-L devices
10 | Rotate
11 | Scale
12 | Crop
13 | not supported crop type
14 |
15 |
--------------------------------------------------------------------------------
/ucrop/src/main/res/values/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1500
4 |
--------------------------------------------------------------------------------