├── .gitignore ├── README.md ├── build.gradle ├── demo ├── .gitignore ├── KeyForEasyPhotos.jks ├── build.gradle ├── proguard-rules.pro ├── release │ ├── demo-release.apk │ └── output.json └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── huantansheng │ │ └── easyphotos │ │ └── demo │ │ ├── GlideEngine.java │ │ ├── MainAdapter.java │ │ ├── MyApplication.java │ │ ├── SampleActivity.java │ │ └── SampleFragments.java │ └── res │ ├── drawable-nodpi │ └── watermark.png │ ├── drawable │ └── side_nav_bar.xml │ ├── layout │ ├── activity_sample.xml │ ├── activity_sample_fragments.xml │ ├── ad_album_items.xml │ ├── ad_photos.xml │ ├── app_bar_sample.xml │ ├── content_sample.xml │ ├── fragment_sample_fragments.xml │ ├── item.xml │ └── nav_header_sample.xml │ ├── menu │ ├── activity_sample_drawer.xml │ └── sample.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ad.jpg │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── file_paths_public.xml ├── easyPhotos ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── huantansheng │ │ └── easyphotos │ │ ├── Builder │ │ └── AlbumBuilder.java │ │ ├── EasyPhotos.java │ │ ├── callback │ │ ├── PuzzleCallback.java │ │ └── SelectCallback.java │ │ ├── constant │ │ ├── Code.java │ │ ├── Key.java │ │ └── Type.java │ │ ├── engine │ │ └── ImageEngine.java │ │ ├── models │ │ ├── ad │ │ │ ├── AdEntity.java │ │ │ ├── AdListener.java │ │ │ └── AdViewHolder.java │ │ ├── album │ │ │ ├── AlbumModel.java │ │ │ └── entity │ │ │ │ ├── Album.java │ │ │ │ ├── AlbumItem.java │ │ │ │ └── Photo.java │ │ ├── puzzle │ │ │ ├── Area.java │ │ │ ├── DegreeSeekBar.java │ │ │ ├── Line.java │ │ │ ├── MatrixUtils.java │ │ │ ├── PuzzleLayout.java │ │ │ ├── PuzzlePiece.java │ │ │ ├── PuzzleUtils.java │ │ │ ├── PuzzleView.java │ │ │ ├── SquarePuzzleView.java │ │ │ ├── slant │ │ │ │ ├── CrossoverPointF.java │ │ │ │ ├── SlantArea.java │ │ │ │ ├── SlantLine.java │ │ │ │ ├── SlantPuzzleLayout.java │ │ │ │ └── SlantUtils.java │ │ │ ├── straight │ │ │ │ ├── StraightArea.java │ │ │ │ ├── StraightLine.java │ │ │ │ ├── StraightPuzzleLayout.java │ │ │ │ └── StraightUtils.java │ │ │ └── template │ │ │ │ ├── slant │ │ │ │ ├── NumberSlantLayout.java │ │ │ │ ├── OneSlantLayout.java │ │ │ │ ├── SlantLayoutHelper.java │ │ │ │ ├── ThreeSlantLayout.java │ │ │ │ └── TwoSlantLayout.java │ │ │ │ └── straight │ │ │ │ ├── EightStraightLayout.java │ │ │ │ ├── FiveStraightLayout.java │ │ │ │ ├── FourStraightLayout.java │ │ │ │ ├── NineStraightLayout.java │ │ │ │ ├── NumberStraightLayout.java │ │ │ │ ├── OneStraightLayout.java │ │ │ │ ├── SevenStraightLayout.java │ │ │ │ ├── SixStraightLayout.java │ │ │ │ ├── StraightLayoutHelper.java │ │ │ │ ├── ThreeStraightLayout.java │ │ │ │ └── TwoStraightLayout.java │ │ └── sticker │ │ │ ├── StickerModel.java │ │ │ ├── cache │ │ │ └── StickerCache.java │ │ │ ├── entity │ │ │ └── TextStickerData.java │ │ │ ├── listener │ │ │ └── OnStickerClickListener.java │ │ │ └── view │ │ │ ├── BitmapSticker.java │ │ │ ├── EditFragment.java │ │ │ └── TextSticker.java │ │ ├── result │ │ └── Result.java │ │ ├── setting │ │ └── Setting.java │ │ ├── ui │ │ ├── EasyPhotosActivity.java │ │ ├── PreviewActivity.java │ │ ├── PreviewFragment.java │ │ ├── PuzzleActivity.java │ │ ├── PuzzleSelectorActivity.java │ │ ├── adapter │ │ │ ├── AlbumItemsAdapter.java │ │ │ ├── PhotosAdapter.java │ │ │ ├── PreviewPhotosAdapter.java │ │ │ ├── PreviewPhotosFragmentAdapter.java │ │ │ ├── PuzzleAdapter.java │ │ │ ├── PuzzleSelectorAdapter.java │ │ │ ├── PuzzleSelectorPreviewAdapter.java │ │ │ └── TextStickerAdapter.java │ │ ├── dialog │ │ │ └── LoadingDialog.java │ │ └── widget │ │ │ ├── PressedImageView.java │ │ │ ├── PressedTextView.java │ │ │ └── PreviewRecyclerView.java │ │ └── utils │ │ ├── Color │ │ └── ColorUtils.java │ │ ├── String │ │ └── StringUtils.java │ │ ├── bitmap │ │ ├── BitmapUtils.java │ │ └── SaveBitmapCallBack.java │ │ ├── file │ │ └── FileUtils.java │ │ ├── media │ │ ├── DurationUtils.java │ │ └── MediaScannerConnectionUtils.java │ │ ├── permission │ │ └── PermissionUtil.java │ │ ├── result │ │ ├── EasyResult.java │ │ └── HolderFragment.java │ │ ├── settings │ │ └── SettingsUtils.java │ │ ├── system │ │ ├── MeiZuStatusUtils.java │ │ └── SystemUtils.java │ │ └── uri │ │ └── UriUtils.java │ └── res │ ├── drawable │ ├── bg_dialog_album_items_background_easy_photos.xml │ ├── bg_dialog_loading_easy_photos.xml │ ├── bg_menu_done_easy_photos.xml │ ├── bg_second_level_menu_easy_photos.xml │ ├── bg_seek_bar_alpha_easy_photos.xml │ ├── bg_select_false_easy_photos.xml │ ├── bg_select_false_unable_easy_photos.xml │ ├── bg_select_true_easy_photos.xml │ ├── bg_selected_frame_easy_photos.xml │ ├── bg_selected_frame_puzzle_easy_photos.xml │ ├── bg_text_sticker_editor_easy_photos.xml │ ├── ic_album_item_choose_easy_photos.xml │ ├── ic_album_items_name_easy_photos.xml │ ├── ic_arrow_back_easy_photos.xml │ ├── ic_arrow_down_easy_photos.xml │ ├── ic_arrow_up_easy_photos.xml │ ├── ic_black_easy_photos.xml │ ├── ic_blue_easy_photos.xml │ ├── ic_camera_easy_photos.xml │ ├── ic_clear_easy_photos.xml │ ├── ic_cyan_easy_photos.xml │ ├── ic_delete_easyy_photos.xml │ ├── ic_edit_easy_photos.xml │ ├── ic_gray_easy_photos.xml │ ├── ic_green_easy_photos.xml │ ├── ic_notifications_easy_photos.xml │ ├── ic_orange_easy_photos.xml │ ├── ic_play_easy_photos.xml │ ├── ic_purple_easy_photos.xml │ ├── ic_puzzle_corner_easy_photos.xml │ ├── ic_puzzle_flip_easy_photos.xml │ ├── ic_puzzle_mirror_easy_photos.xml │ ├── ic_puzzle_padding_easy_photos.xml │ ├── ic_puzzle_replace_easy_photos.xml │ ├── ic_puzzle_rotate_easy_photos.xml │ ├── ic_red_easy_photos.xml │ ├── ic_selector_easy_photos.xml │ ├── ic_selector_true_easy_photos.xml │ ├── ic_settings_easy_photos.xml │ ├── ic_white_easy_photos.xml │ ├── ic_yelow_easy_photos.xml │ ├── progress_bar_easy_photos.xml │ └── thumb_seek_bar_alpha_easy_photos.xml │ ├── layout │ ├── activity_easy_photos.xml │ ├── activity_preview_easy_photos.xml │ ├── activity_puzzle_easy_photos.xml │ ├── activity_puzzle_selector_easy_photos.xml │ ├── dialog_loading_easy_photos.xml │ ├── fragment_preview_easy_photos.xml │ ├── fragment_text_sticker_easy_photos.xml │ ├── item_ad_easy_photos.xml │ ├── item_camera_easy_photos.xml │ ├── item_dialog_album_items_easy_photos.xml │ ├── item_preview_photo_easy_photos.xml │ ├── item_preview_selected_photos_easy_photos.xml │ ├── item_puzzle_easy_photos.xml │ ├── item_puzzle_selector_easy_photos.xml │ ├── item_puzzle_selector_preview_easy_photos.xml │ ├── item_rv_photos_easy_photos.xml │ └── item_text_sticker_easy_photos.xml │ ├── mipmap-xhdpi │ ├── ic_controller_easy_photos.png │ ├── ic_delete_easy_photos.png │ ├── ic_editor_easy_photos.png │ ├── ic_mirror_easy_photos.png │ └── ic_rotate_easy_photos.png │ ├── mipmap-xxhdpi │ ├── ic_controller_easy_photos.png │ ├── ic_delete_easy_photos.png │ ├── ic_editor_easy_photos.png │ ├── ic_mirror_easy_photos.png │ └── ic_rotate_easy_photos.png │ ├── values-v19 │ └── styles.xml │ ├── values-v21 │ └── styles.xml │ ├── values-w480dp │ └── integers.xml │ ├── values-w640dp │ └── integers.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── integers.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── 01.png ├── 02.png ├── 03.png ├── 04.png ├── 05.png ├── 06.png ├── 07.png ├── 08.png ├── 09.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 17.png └── 18.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Built application files 4 | *.ap_ 5 | 6 | # Files for the ART/Dalvik VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # Generated files 13 | bin/ 14 | gen/ 15 | out/ 16 | 17 | # Gradle files 18 | .gradle/ 19 | build/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Proguard folder generated by Eclipse 25 | proguard/ 26 | 27 | # Log Files 28 | *.log 29 | 30 | # Android Studio Navigation editor temp files 31 | .navigation/ 32 | 33 | # Android Studio captures folder 34 | captures/ 35 | 36 | # IntelliJ 37 | *.iml 38 | .idea 39 | .idea/workspace.xml 40 | .idea/modules.xml 41 | .idea/tasks.xml 42 | .idea/gradle.xml 43 | .idea/assetWizardSettings.xml 44 | .idea/dictionaries 45 | .idea/libraries 46 | .idea/caches 47 | 48 | # Keystore files 49 | # Uncomment the following line if you do not want to check your keystore files in. 50 | #*.jks 51 | 52 | # External native build folder generated in Android Studio 2.2 and later 53 | .externalNativeBuild 54 | 55 | # Google Services (e.g. APIs or Firebase) 56 | google-services.json 57 | 58 | # Freeline 59 | freeline.py 60 | freeline/ 61 | freeline_project_description.json 62 | 63 | # fastlane 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | fastlane/readme.md 69 | 70 | # test 71 | /src/test 72 | /src/androidTest -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | mavenCentral() 6 | maven { url 'https://maven.google.com' } 7 | google() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.4.2' 11 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' 12 | 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | jcenter() 19 | mavenCentral() 20 | maven { url "https://jitpack.io" } 21 | google() 22 | } 23 | } 24 | 25 | task clean(type: Delete) { 26 | delete rootProject.buildDir 27 | } 28 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Built application files 4 | *.ap_ 5 | 6 | # Files for the ART/Dalvik VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # Generated files 13 | bin/ 14 | gen/ 15 | out/ 16 | 17 | # Gradle files 18 | .gradle/ 19 | build/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Proguard folder generated by Eclipse 25 | proguard/ 26 | 27 | # Log Files 28 | *.log 29 | 30 | # Android Studio Navigation editor temp files 31 | .navigation/ 32 | 33 | # Android Studio captures folder 34 | captures/ 35 | 36 | # IntelliJ 37 | *.iml 38 | .idea 39 | .idea/workspace.xml 40 | .idea/modules.xml 41 | .idea/tasks.xml 42 | .idea/gradle.xml 43 | .idea/assetWizardSettings.xml 44 | .idea/dictionaries 45 | .idea/libraries 46 | .idea/caches 47 | 48 | # Keystore files 49 | # Uncomment the following line if you do not want to check your keystore files in. 50 | #*.jks 51 | 52 | # External native build folder generated in Android Studio 2.2 and later 53 | .externalNativeBuild 54 | 55 | # Google Services (e.g. APIs or Firebase) 56 | google-services.json 57 | 58 | # Freeline 59 | freeline.py 60 | freeline/ 61 | freeline_project_description.json 62 | 63 | # fastlane 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | fastlane/readme.md 69 | 70 | # test 71 | /src/test 72 | /src/androidTest -------------------------------------------------------------------------------- /demo/KeyForEasyPhotos.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/KeyForEasyPhotos.jks -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 30 5 | 6 | defaultConfig { 7 | applicationId "com.huantansheng.easyphotos.demo" 8 | minSdkVersion 15 9 | targetSdkVersion 30 10 | versionCode 2 11 | versionName "1.0.2" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | //EasyPhotos asdfghjkl 22 | dependencies { 23 | implementation fileTree(include: ['*.jar'], dir: 'libs') 24 | androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 28 | implementation 'androidx.appcompat:appcompat:1.1.0' 29 | implementation 'androidx.recyclerview:recyclerview:1.1.0' 30 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 31 | implementation 'com.google.android.material:material:1.1.0' 32 | testImplementation 'junit:junit:4.12' 33 | 34 | implementation project(':easyPhotos') 35 | 36 | implementation("com.github.bumptech.glide:glide:4.11.0") { 37 | exclude group: "com.android.support" 38 | } 39 | annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' 40 | //检测内存泄漏 41 | debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' 42 | releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' 43 | } 44 | -------------------------------------------------------------------------------- /demo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #EasyPhotos 2 | 3 | -keep class com.huantansheng.easyphotos.models.** { *; } 4 | 5 | #glide 6 | -keep public class * implements com.bumptech.glide.module.GlideModule 7 | -keep public class * extends com.bumptech.glide.AppGlideModule 8 | -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 9 | **[] $VALUES; 10 | public *; 11 | } -------------------------------------------------------------------------------- /demo/release/demo-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/release/demo-release.apk -------------------------------------------------------------------------------- /demo/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":2,"versionName":"1.0.2","enabled":true,"outputFile":"demo-release.apk","fullName":"release","baseName":"release"},"path":"demo-release.apk","properties":{}}] -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 32 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /demo/src/main/java/com/huantansheng/easyphotos/demo/GlideEngine.java: -------------------------------------------------------------------------------- 1 | package com.huantansheng.easyphotos.demo; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.net.Uri; 6 | import android.widget.ImageView; 7 | 8 | import androidx.annotation.NonNull; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.huantansheng.easyphotos.engine.ImageEngine; 12 | 13 | import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; 14 | 15 | /** 16 | * Glide4.x的加载图片引擎实现,单例模式 17 | * Glide4.x的缓存机制更加智能,已经达到无需配置的境界。如果使用Glide3.x,需要考虑缓存机制。 18 | * Created by huan on 2018/1/15. 19 | */ 20 | 21 | public class GlideEngine implements ImageEngine { 22 | //单例 23 | private static GlideEngine instance = null; 24 | //单例模式,私有构造方法 25 | private GlideEngine() { 26 | } 27 | //获取单例 28 | public static GlideEngine getInstance() { 29 | if (null == instance) { 30 | synchronized (GlideEngine.class) { 31 | if (null == instance) { 32 | instance = new GlideEngine(); 33 | } 34 | } 35 | } 36 | return instance; 37 | } 38 | 39 | /** 40 | * 加载图片到ImageView 41 | * 42 | * @param context 上下文 43 | * @param uri 图片路径Uri 44 | * @param imageView 加载到的ImageView 45 | */ 46 | //安卓10推荐uri,并且path的方式不再可用 47 | @Override 48 | public void loadPhoto(@NonNull Context context, @NonNull Uri uri, @NonNull ImageView imageView) { 49 | Glide.with(context).load(uri).transition(withCrossFade()).into(imageView); 50 | } 51 | 52 | /** 53 | * 加载gif动图图片到ImageView,gif动图不动 54 | * 55 | * @param context 上下文 56 | * @param gifUri gif动图路径Uri 57 | * @param imageView 加载到的ImageView 58 | *

59 | * 备注:不支持动图显示的情况下可以不写 60 | */ 61 | //安卓10推荐uri,并且path的方式不再可用 62 | @Override 63 | public void loadGifAsBitmap(@NonNull Context context, @NonNull Uri gifUri, @NonNull ImageView imageView) { 64 | Glide.with(context).asBitmap().load(gifUri).into(imageView); 65 | } 66 | 67 | /** 68 | * 加载gif动图到ImageView,gif动图动 69 | * 70 | * @param context 上下文 71 | * @param gifUri gif动图路径Uri 72 | * @param imageView 加载动图的ImageView 73 | *

74 | * 备注:不支持动图显示的情况下可以不写 75 | */ 76 | //安卓10推荐uri,并且path的方式不再可用 77 | @Override 78 | public void loadGif(@NonNull Context context, @NonNull Uri gifUri, @NonNull ImageView imageView) { 79 | Glide.with(context).asGif().load(gifUri).transition(withCrossFade()).into(imageView); 80 | } 81 | 82 | 83 | /** 84 | * 获取图片加载框架中的缓存Bitmap,不用拼图功能可以直接返回null 85 | * 86 | * @param context 上下文 87 | * @param uri 图片路径 88 | * @param width 图片宽度 89 | * @param height 图片高度 90 | * @return Bitmap 91 | * @throws Exception 异常直接抛出,EasyPhotos内部处理 92 | */ 93 | //安卓10推荐uri,并且path的方式不再可用 94 | @Override 95 | public Bitmap getCacheBitmap(@NonNull Context context, @NonNull Uri uri, int width, int height) throws Exception { 96 | return Glide.with(context).asBitmap().load(uri).submit(width, height).get(); 97 | } 98 | 99 | 100 | } 101 | -------------------------------------------------------------------------------- /demo/src/main/java/com/huantansheng/easyphotos/demo/MainAdapter.java: -------------------------------------------------------------------------------- 1 | package com.huantansheng.easyphotos.demo; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | import com.bumptech.glide.Glide; 12 | import com.bumptech.glide.RequestManager; 13 | import com.huantansheng.easyphotos.models.album.entity.Photo; 14 | 15 | import java.util.ArrayList; 16 | 17 | /** 18 | * 返回图片的列表适配器 19 | * Created by huan on 2017/10/30. 20 | */ 21 | 22 | public class MainAdapter extends RecyclerView.Adapter { 23 | private ArrayList list; 24 | private LayoutInflater mInflater; 25 | private RequestManager mGlide; 26 | 27 | MainAdapter(Context cxt, ArrayList list) { 28 | this.list = list; 29 | mInflater = LayoutInflater.from(cxt); 30 | mGlide = Glide.with(cxt); 31 | } 32 | 33 | @Override 34 | public MainVH onCreateViewHolder(ViewGroup parent, int viewType) { 35 | return new MainVH(mInflater.inflate(R.layout.item, parent, false)); 36 | } 37 | 38 | @Override 39 | public void onBindViewHolder(MainVH holder, int position) { 40 | Photo photo = list.get(position); 41 | mGlide.load(photo.uri).into(holder.ivPhoto); 42 | holder.tvMessage.setText("[图片名称]: "+photo.name+"\n[宽]:"+photo.width+"\n[高]:"+photo.height+"\n[文件大小,单位bytes]:"+photo.size+"\n[日期,时间戳,毫秒]:"+photo.time+"\n[图片地址]:"+photo.path+"\n[图片类型]:"+photo.type+"\n[是否选择原图]:"+photo.selectedOriginal+"\n[视频时长]:"+photo.duration); 43 | } 44 | 45 | @Override 46 | public int getItemCount() { 47 | return list.size(); 48 | } 49 | 50 | class MainVH extends RecyclerView.ViewHolder { 51 | ImageView ivPhoto; 52 | TextView tvMessage; 53 | MainVH(View itemView) { 54 | super(itemView); 55 | ivPhoto = (ImageView) itemView.findViewById(R.id.iv_photo); 56 | tvMessage = (TextView) itemView.findViewById(R.id.tv_message); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /demo/src/main/java/com/huantansheng/easyphotos/demo/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.huantansheng.easyphotos.demo; 2 | 3 | import android.app.Application; 4 | 5 | import com.squareup.leakcanary.LeakCanary; 6 | 7 | /** 8 | * 主要用于检测内存泄漏 9 | * Created by huan on 2018/1/30. 10 | */ 11 | 12 | public class MyApplication extends Application { 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | if (LeakCanary.isInAnalyzerProcess(this)) { 17 | // This process is dedicated to LeakCanary for heap analysis. 18 | // You should not init your app in this process. 19 | return; 20 | } 21 | LeakCanary.install(this); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-nodpi/watermark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/drawable-nodpi/watermark.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_sample_fragments.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 27 | 28 | 29 | 30 | 34 | 35 | 40 | 41 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/ad_album_items.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 22 | 23 | 24 | 38 | 39 | 51 | 52 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/ad_photos.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 20 | 21 | 34 | 35 | 47 | 48 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/app_bar_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/content_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 19 | 20 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/fragment_sample_fragments.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | 17 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 15 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/nav_header_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 21 | 22 | 28 | 29 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /demo/src/main/res/menu/activity_sample_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 |

5 | 6 | 7 | 8 | 9 | 13 | 17 | 21 | 25 | 26 | 30 | 31 | 35 | 36 | 40 | 44 | 45 | 49 | 50 | 54 | 55 | 59 | 60 | 64 | 65 | 69 | 70 | 73 | 74 | 77 | 78 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 93 | 94 | 97 | 98 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /demo/src/main/res/menu/sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xxhdpi/ad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xxhdpi/ad.jpg -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /demo/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #393a3f 4 | #303135//303135 5 | #FF4081 6 | 7 | #66000000 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /demo/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 8dp 6 | 176dp 7 | 16dp 8 | 8dp 9 | -------------------------------------------------------------------------------- /demo/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | EasyPhotosDemo 3 | SampleActivity 4 | Open navigation drawer 5 | Close navigation drawer 6 | Settings 7 | 相册(有相机单选,无宽高) 8 | 相册(有相机多选,无宽高) 9 | 相册(有宽高数据、链式调用写法) 10 | 相册(带默认勾选,不显示拼图按钮,无宽高) 11 | 相册(尺寸和大小限制) 12 | 相册(显示原图按钮,默认选中) 13 | 相册(显示原图按钮,不可用) 14 | 相册(支持video和gif) 15 | 相册(只显示video) 16 | 相册(不显示底部编辑图标按钮) 17 | 相册(无相机单选,无宽高) 18 | 相册(无相机多选,无宽高) 19 | 相册(带广告,无宽高) 20 | 相册 (复杂选择情况,2个视频3张图片) 21 | 相册 (复杂选择情况,动态单一类型) 22 | 相机(有宽高) 23 | 图片添加水印 24 | 人脸检测 25 | 拼图(作为单独功能使用) 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /demo/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values-w480dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values-w640dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #303135 4 | #00000000 5 | #FFFFFF 6 | #FFFFFF//按钮上的文字颜色,选择器上的文字颜色,选择器的边框颜色 7 | 8 | 9 | #FFFFFF//专辑项目列表的背景颜色 10 | #3e4145//专辑项目列表中专辑名称的字体颜色 11 | #4f5555//专辑项目列表中包含图片张数的字体颜色 12 | 13 | 14 | #33FFFFFF加载框背景颜色 15 | 16 | 17 | #d0021b//编辑字体颜色为红色 18 | #f5a623//编辑字体颜色为橙色 19 | #f8e71c//编辑字体颜色为黄色 20 | #7ed321//编辑字体颜色为绿色 21 | #50e3c2//编辑字体颜色为青色 22 | #4a90e2//编辑字体颜色为蓝色 23 | #9013fe//编辑字体颜色为紫色 24 | #000000//编辑字体颜色为黑色 25 | #4a4a4a//编辑字体颜色为灰色 26 | #ffffff//编辑字体颜色为白色 27 | #2c2e30//编辑界面背景色 28 | #393a3f//编辑界面操作栏颜色 29 | 30 | 31 | #ffffff//3e4145 前景主色,如字体颜色、icon颜色 32 | #9b9b9b//前景偏暗色,如不可用状态的字体颜色 33 | #00AA00//578fff 前景突出色,如发送按钮的背景色,选中状态的颜色 34 | 35 | 36 | #000000//f9f9f9 背景色,如每个activity的背景色,相册的图片间隔线颜色 37 | 38 | 39 | #393a3f//ffffff 操作栏主色,如相册页顶部和底部操作栏 40 | #303135//f9f9f9 操作栏偏暗色,操作栏间隔线颜色,如相册页返回按钮右边的竖线 41 | #eb212123//b4ffffff 操作栏带透明的色值,如预览页的底部操作栏颜色,相册页的相机按钮背景颜色。 42 | 43 | 44 | #393a3f 45 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16sp 3 | 42dp 4 | 5 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | EasyPhotos 3 | 4 | 所有图片 5 | 6 | 图片和视频 7 | 8 | 所有视频 9 | 10 | 选择 11 | 12 | 13 | 完成(%1$d/%2$d) 14 | 15 | 预览 16 | 17 | 超出最大选择数 18 | 19 | 最多只能选择%d张图片 20 | 21 | 最多只能选择%d个视频 22 | 23 | 需要选择同种类型的文件 24 | 25 | 无法启动相机! 26 | 27 | 图片错误 28 | 29 | 权限错误,无法正常工作! 30 | 31 | 图片的宽度必须大于%1$d,高度必须大于%2$d 32 | 33 | 不支持此图片格式 34 | 35 | 编辑 36 | 37 | 清空 38 | 39 | 没有符合要求的图片,拍一张吧 40 | 41 | 没有符合要求的视频 42 | 43 | 请点击并允许相关权限 44 | 45 | 请点击并在设置中允许相关权限 46 | 47 | 原图 48 | 49 | %1$d/%2$d 50 | 51 | 完成 52 | 53 | 取消 54 | 55 | 模板 56 | 57 | 文字 58 | 59 | 日期 60 | 61 | 双击编辑 62 | 63 | 自定义 64 | 65 | 图片选择 66 | 67 | 视频选择 68 | 69 | 拼一张 70 | 71 | 请选择2 \- 9张照片 72 | 73 | 动图 74 | 75 | 视频 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /easyPhotos/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | android.enableJetifier=true 13 | android.useAndroidX=true 14 | org.gradle.jvmargs=-Xmx1536m 15 | 16 | # When configured, Gradle will run in incubating parallel mode. 17 | # This option should only be used with decoupled projects. More details, visit 18 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 19 | # org.gradle.parallel=true 20 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jul 24 15:15:22 CST 2019 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-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /images/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/01.png -------------------------------------------------------------------------------- /images/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/02.png -------------------------------------------------------------------------------- /images/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/03.png -------------------------------------------------------------------------------- /images/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/04.png -------------------------------------------------------------------------------- /images/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/05.png -------------------------------------------------------------------------------- /images/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/06.png -------------------------------------------------------------------------------- /images/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/07.png -------------------------------------------------------------------------------- /images/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/08.png -------------------------------------------------------------------------------- /images/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/09.png -------------------------------------------------------------------------------- /images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/10.png -------------------------------------------------------------------------------- /images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/11.png -------------------------------------------------------------------------------- /images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/12.png -------------------------------------------------------------------------------- /images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/13.png -------------------------------------------------------------------------------- /images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/14.png -------------------------------------------------------------------------------- /images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/15.png -------------------------------------------------------------------------------- /images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/16.png -------------------------------------------------------------------------------- /images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/17.png -------------------------------------------------------------------------------- /images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HuanTanSheng/EasyPhotos/d07e88b46932565a57c679c292193447be80b575/images/18.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':demo', ':easyPhotos' 2 | --------------------------------------------------------------------------------