├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── julie.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── huburt │ │ └── imagepicker │ │ ├── App.kt │ │ ├── GlideImageLoader.kt │ │ ├── ImageAdapter.kt │ │ ├── MainActivity.kt │ │ └── MainJavaActivity.java │ └── res │ ├── layout │ ├── activity_main.xml │ └── item_image.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 │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── huburt │ │ └── library │ │ ├── C.kt │ │ ├── Delegates.kt │ │ ├── ImageDataSource.kt │ │ ├── ImagePicker.kt │ │ ├── ImagePickerProvider.kt │ │ ├── PickHelper.kt │ │ ├── adapter │ │ ├── ImageFolderAdapter.kt │ │ ├── ImagePageAdapter.kt │ │ ├── ImageRecyclerAdapter.kt │ │ └── SmallPreviewAdapter.kt │ │ ├── bean │ │ ├── ImageFolder.kt │ │ └── ImageItem.kt │ │ ├── loader │ │ └── ImageLoader.kt │ │ ├── ui │ │ ├── BaseActivity.kt │ │ ├── ImageCropActivity.kt │ │ ├── ImageGridActivity.kt │ │ ├── ImagePreviewActivity.kt │ │ ├── ImagePreviewBaseActivity.kt │ │ ├── ImagePreviewDelActivity.kt │ │ └── ShadowActivity.kt │ │ ├── util │ │ ├── BitmapUtil.java │ │ ├── CameraUtil.kt │ │ ├── DateUtil.kt │ │ ├── FileUtil.kt │ │ ├── ProviderUtil.kt │ │ └── Utils.kt │ │ └── view │ │ ├── CropImageView.java │ │ ├── FolderPopUpWindow.kt │ │ └── GridSpacingItemDecoration.kt │ └── res │ ├── anim │ ├── fade_in.xml │ ├── fade_out.xml │ ├── hide_to_bottom.xml │ ├── show_from_bottom.xml │ ├── top_in.xml │ └── top_out.xml │ ├── drawable-v21 │ └── bg_folder_item.xml │ ├── drawable │ ├── bg_btn_dis.xml │ ├── bg_btn_nor.xml │ ├── bg_btn_pre.xml │ ├── bg_folder_item.xml │ ├── bg_image_folder.xml │ ├── ic_arrow_back.xml │ ├── ic_cover_shade.xml │ ├── ic_default_image.xml │ ├── ic_vector_check.xml │ ├── ic_vector_delete.xml │ ├── selector_back_press.xml │ ├── selector_grid_camera_bg.xml │ ├── selector_item_checked.xml │ ├── selector_top_ok.xml │ └── shape_frame.xml │ ├── layout │ ├── activity_image_crop.xml │ ├── activity_image_grid.xml │ ├── activity_image_preview.xml │ ├── adapter_camera_item.xml │ ├── adapter_folder_list_item.xml │ ├── adapter_image_list_item.xml │ ├── include_top_bar.xml │ ├── item_small_preview.xml │ └── pop_folder.xml │ ├── mipmap-xxhdpi │ ├── checkbox_checked.png │ ├── checkbox_normal.png │ ├── grid_camera.png │ └── text_indicator.png │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── provider_paths.xml ├── screen ├── device-2017-10-16-095841.png ├── device-2017-11-01-110941.png ├── device-2017-11-01-111126.png ├── device-2017-11-01-111209.png ├── show_time.png └── small_preview.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/dictionaries/julie.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | Android > Lint > Correctness 36 | 37 | 38 | Android > Lint > Performance 39 | 40 | 41 | Android > Lint > Usability > Icons 42 | 43 | 44 | Bitwise operation issuesJava 45 | 46 | 47 | Control flow issuesJava 48 | 49 | 50 | Error handlingJava 51 | 52 | 53 | Groovy 54 | 55 | 56 | Java 57 | 58 | 59 | Numeric issuesJava 60 | 61 | 62 | Performance issuesJava 63 | 64 | 65 | Potentially confusing code constructsGroovy 66 | 67 | 68 | Threading issuesGroovy 69 | 70 | 71 | Threading issuesJava 72 | 73 | 74 | 75 | 76 | AndroidLintOverdraw 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 88 | 89 | $USER_HOME$/.subversion 90 | 91 | 92 | 93 | 94 | 95 | 1.8 96 | 97 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ImagePicker 2 | 3 | ## 前言 4 | 用Kotlin实现的一个仿微信的图片选择库 5 | 6 | 这是一个我在学习Kotlin过程中的一个练手项目,写这个的库的起因是在使用原作者的库时发现了库的bug,查看github发现作者已经声明不在维护这个库了。非常遗憾,只能clone了代码,自己修复bug。正巧当时正在学习Kotlin,于是便决定用Kotlin复写一下这个库,当做是学习练手。 7 | 8 | 首先感谢一下原作者: 9 | [https://github.com/jeasonlzy/ImagePicker](https://github.com/jeasonlzy/ImagePicker) 10 | 11 | ## 更新日志 12 | 13 | **v1.1** 14 | 15 | 为了向微信原版靠拢,新增了如下功能 16 | 17 | 1. 网格视图界面增加滑动显示图片时间 18 | 2. 预览界面增加已选图片的缩略图 19 | 20 | **v1.0** 21 | 22 | 复刻原库的功能,修复`android.os.TransactionTooLargeException`的bug 23 | 24 | 25 | ## 效果 26 | 27 | ![ImageGridActivity](https://github.com/huburt-Hu/ImagePicker/raw/master/screen/show_time.png) 28 | ![ImagePreviewActivity](https://github.com/huburt-Hu/ImagePicker/raw/master/screen/small_preview.png) 29 | 30 | 31 | ## 原理细节 32 | 想了解库中的实现原理和细节,请戳:[Kotlin 实战翻译 —— 仿微信图片选择开源库ImagePicker](http://www.jianshu.com/p/8561b1d1f763) 33 | 34 | ## 此库依赖 35 | 36 | ``` 37 | compile 'com.android.support:appcompat-v7:25.3.1' 38 | compile 'com.android.support:recyclerview-v7:25.3.1' 39 | compile 'com.android.support:support-v4:25.3.1' 40 | compile 'com.github.chrisbanes:PhotoView:1.3.1' 41 | ``` 42 | 43 | ## 集成 44 | ### 项目build.gradle添加 45 | 46 | ``` 47 | allprojects { 48 | repositories { 49 | maven { url 'https://jitpack.io' } 50 | } 51 | } 52 | ``` 53 | ### module的build.gradle添加 54 | 55 | ``` 56 | dependencies { 57 | compile 'com.github.huburt-Hu:ImagePicker:1.0' 58 | } 59 | ``` 60 | 此库中有着对com.android.support的依赖,如果你的项目中也使用了这些库,建议排除我的库中的引用,避免依赖冲突,可通过如下配置(ps:确保你的项目中有appcompat-v7,recyclerview-v7,support-v4,否者会报异常,inflate xml 找不到对应类): 61 | 62 | ``` 63 | dependencies { 64 | compile('com.github.huburt-Hu:ImagePicker:1.0') { 65 | exclude group: 'com.android.support' 66 | } 67 | } 68 | ``` 69 | ### 根据自己的图片框架实现 com.huburt.library.loader.ImageLoader 接口 70 | 71 | 下面是Glide实现的示例 72 | 73 | ``` 74 | import android.app.Activity 75 | import android.net.Uri 76 | import android.widget.ImageView 77 | import com.bumptech.glide.Glide 78 | import com.huburt.library.R 79 | import com.huburt.library.loader.ImageLoader 80 | import java.io.File 81 | 82 | class GlideImageLoader : ImageLoader { 83 | 84 | override fun displayImage(activity: Activity, path: String, imageView: ImageView, width: Int, height: Int) { 85 | Glide.with(activity) //配置上下文 86 | .load(Uri.fromFile(File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) 87 | .error(R.drawable.ic_default_image) //设置错误图片 88 | .placeholder(R.drawable.ic_default_image) //设置占位图片 89 | .into(imageView) 90 | } 91 | 92 | override fun displayImagePreview(activity: Activity, path: String, imageView: ImageView, width: Int, height: Int) { 93 | Glide.with(activity) //配置上下文 94 | .load(Uri.fromFile(File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) 95 | .into(imageView) 96 | } 97 | 98 | override fun clearMemoryCache() { 99 | 100 | } 101 | } 102 | ``` 103 | ### 在Application的onCreate中初始化 104 | 105 | ``` 106 | //初始化图片加载器 107 | ImagePicker.init(GlideImageLoader()) 108 | //设置全局自定义默认配置 109 | ImagePicker 110 | .limit(9)//选择图片数量限制,默认9张 111 | .isCrop(true)//拍照后是否裁剪,默认false 112 | .showCamera(true)//列表是否显示拍照,默认true 113 | .multiMode(true)//false单选/true多选,默认true 114 | .saveAsDefault()//保存为自定义 115 | ``` 116 | 117 | ### 使用 118 | 119 | * 选择配置,可以省略,使用临时配置(如有)或者默认 120 | 121 | ``` 122 | //使用自定义默认参数或者默认参数 123 | ImagePicker.defaultConfig(); 124 | //使用临时图片参数,有效期持续到下次调用defaultConfig()或者clear()方法 125 | // ImagePicker.limit(12); 126 | ``` 127 | 128 | * 调用选择图片 129 | 130 | Kotlin调用 131 | 132 | ``` 133 | ImagePicker.pick(this, object : ImagePicker.OnPickImageResultListener { 134 | override fun onImageResult(imageItems: ArrayList) { 135 | //imageItems只会size为0,不会为null 136 | } 137 | } 138 | }) 139 | ``` 140 | java调用 141 | 142 | ``` 143 | ImagePicker.pick(MainJavaActivity.this, new ImagePicker.OnPickImageResultListener() { 144 | @Override 145 | public void onImageResult(@NotNull ArrayList imageItems) { 146 | 147 | } 148 | }); 149 | ``` 150 | * 直接打开相机,一次只能获取1张图片 151 | 152 | ``` 153 | ImagePicker.camera(context,listener)//参数同pick 154 | ``` 155 | * 回顾已选择图片,可以删除,listener返回删除后的集合 156 | 157 | ``` 158 | ImagePicker.review(context,position,listener) 159 | ``` 160 | 161 | 162 | **listener返回ImageItem集合,ImageItem包含了图片的信息:** 163 | 164 | | 字段 | 含义 | 165 | | ------- | :--------:| 166 | | path | 图片的路径 | 167 | | name | 图片的名字 | 168 | | size | 图片的大小 | 169 | | width | 图片的宽度 | 170 | | height | 图片的高度 | 171 | | mimeType | 图片的类型 | 172 | 173 | 174 | ## 最后 175 | 176 | 这个库会持续维护下去,并且根据微信的更新,添加新功能,目前已计划增加网格视图滚动显示图片时间,预览界面显示所用选择图片。 177 | 如果你在使用的过程中,发现bug或者更好的建议,可以给我留言。更欢迎技术交流~ 178 | 179 | 180 | ## License 181 | 182 | ``` 183 | Copyright 2017 huburt-Hu 184 | 185 | Licensed under the Apache License, Version 2.0 (the "License"); 186 | you may not use this file except in compliance with the License. 187 | You may obtain a copy of the License at 188 | 189 | http://www.apache.org/licenses/LICENSE-2.0 190 | 191 | Unless required by applicable law or agreed to in writing, software 192 | distributed under the License is distributed on an "AS IS" BASIS, 193 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 194 | See the License for the specific language governing permissions and 195 | limitations under the License. 196 | ``` -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 25 7 | buildToolsVersion "25.0.3" 8 | defaultConfig { 9 | applicationId "com.huburt.imagepicker" 10 | minSdkVersion 16 11 | targetSdkVersion 25 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | compile fileTree(include: ['*.jar'], dir: 'libs') 25 | compile 'com.android.support:appcompat-v7:25.3.1' 26 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 27 | compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 28 | compile project(':library') 29 | compile 'com.github.bumptech.glide:glide:3.7.0' 30 | } 31 | repositories { 32 | mavenCentral() 33 | } 34 | -------------------------------------------------------------------------------- /app/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/julie/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 | 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 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/huburt/imagepicker/App.kt: -------------------------------------------------------------------------------- 1 | package com.huburt.imagepicker 2 | 3 | import android.app.Application 4 | import com.huburt.library.ImagePicker 5 | 6 | /** 7 | * Created by hubert 8 | * 9 | * Created on 2017/10/24. 10 | */ 11 | class App : Application() { 12 | 13 | override fun onCreate() { 14 | super.onCreate() 15 | ImagePicker.init(GlideImageLoader()) 16 | //保存为自定义默认 17 | ImagePicker.limit(12).isCrop(true).saveAsDefault() 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/huburt/imagepicker/GlideImageLoader.kt: -------------------------------------------------------------------------------- 1 | package com.huburt.imagepicker 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.widget.ImageView 6 | import com.bumptech.glide.Glide 7 | import com.bumptech.glide.load.engine.DiskCacheStrategy 8 | import com.huburt.library.R 9 | import com.huburt.library.loader.ImageLoader 10 | import java.io.File 11 | 12 | /** 13 | * Created by hubert 14 | * 15 | * Created on 2017/10/12. 16 | */ 17 | class GlideImageLoader : ImageLoader { 18 | 19 | override fun displayImage(activity: Activity, path: String, imageView: ImageView, width: Int, height: Int) { 20 | Glide.with(activity) //配置上下文 21 | .load(Uri.fromFile(File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) 22 | .error(R.drawable.ic_default_image) //设置错误图片 23 | .placeholder(R.drawable.ic_default_image) //设置占位图片 24 | .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存全尺寸 25 | .into(imageView) 26 | } 27 | 28 | override fun displayImagePreview(activity: Activity, path: String, imageView: ImageView, width: Int, height: Int) { 29 | Glide.with(activity) //配置上下文 30 | .load(Uri.fromFile(File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) 31 | .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存全尺寸 32 | .into(imageView) 33 | } 34 | 35 | override fun clearMemoryCache() { 36 | 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/huburt/imagepicker/ImageAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.huburt.imagepicker 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.support.v7.widget.RecyclerView 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import android.widget.AbsListView 10 | import android.widget.ImageView 11 | import com.bumptech.glide.Glide 12 | import com.huburt.library.bean.ImageItem 13 | import com.huburt.library.util.Utils 14 | import java.io.File 15 | 16 | /** 17 | * Created by hubert 18 | * 19 | * Created on 2017/10/24. 20 | */ 21 | class ImageAdapter constructor( 22 | private var images: List 23 | ) : RecyclerView.Adapter() { 24 | 25 | var listener: OnItemClickListener? = null 26 | 27 | fun updateData(images: List) { 28 | this.images = images 29 | notifyDataSetChanged() 30 | } 31 | 32 | override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ImageViewHolder { 33 | return ImageViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.item_image, parent, false)) 34 | } 35 | 36 | override fun onBindViewHolder(holder: ImageViewHolder?, position: Int) { 37 | holder?.imageView?.setOnClickListener({ 38 | listener?.onItemClick(position) 39 | }) 40 | Glide.with(holder?.imageView?.context) 41 | .load(Uri.fromFile(File(images[position].path))) 42 | .into(holder?.imageView) 43 | 44 | } 45 | 46 | override fun getItemCount(): Int { 47 | return images.size 48 | } 49 | 50 | inner class ImageViewHolder constructor(var rootView: View) : RecyclerView.ViewHolder(rootView) { 51 | val imageView: ImageView = rootView.findViewById(R.id.iv) as ImageView 52 | init { 53 | rootView.layoutParams = AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Utils.getImageItemWidth(rootView.context as Activity)) 54 | } 55 | } 56 | 57 | interface OnItemClickListener { 58 | fun onItemClick(position: Int) 59 | } 60 | } -------------------------------------------------------------------------------- /app/src/main/java/com/huburt/imagepicker/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.huburt.imagepicker 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | import android.support.v7.widget.GridLayoutManager 6 | import com.huburt.library.ImagePicker 7 | import com.huburt.library.bean.ImageItem 8 | import com.huburt.library.util.Utils 9 | import com.huburt.library.view.GridSpacingItemDecoration 10 | import kotlinx.android.synthetic.main.activity_main.* 11 | 12 | /** 13 | * Created by hubert 14 | *

15 | * Created on 2017/10/31. 16 | *

17 | * 18 | */ 19 | class MainActivity : AppCompatActivity(), ImagePicker.OnPickImageResultListener { 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | setContentView(R.layout.activity_main) 24 | //使用自定义默认参数或者默认参数,并清除Application启动之后选择图片缓存 25 | ImagePicker.defaultConfig() 26 | //临时改变选择图片参数 27 | // ImagePicker.limit(12); 28 | //默认不裁剪 29 | cb_crop.setOnCheckedChangeListener({ _, isChecked -> ImagePicker.isCrop(isChecked) }) 30 | cb_multi.isChecked = true//默认是多选 31 | cb_multi.setOnCheckedChangeListener { _, isChecked -> ImagePicker.multiMode(isChecked) } 32 | btn_pick.setOnClickListener { 33 | //选择图片,第二次进入会自动带入之前选择的图片(未重置图片参数) 34 | ImagePicker.pick(this@MainActivity, this@MainActivity) 35 | } 36 | btn_camera.setOnClickListener { 37 | //直接打开相机 38 | ImagePicker.camera(this@MainActivity, this@MainActivity) 39 | } 40 | recycler_view.layoutManager = GridLayoutManager(this, 3) 41 | val imageAdapter = ImageAdapter(ArrayList()) 42 | imageAdapter.listener = object : ImageAdapter.OnItemClickListener { 43 | override fun onItemClick(position: Int) { 44 | //回顾已选择图片,可以删除 45 | ImagePicker.review(this@MainActivity, position, this@MainActivity) 46 | } 47 | } 48 | recycler_view.addItemDecoration(GridSpacingItemDecoration(3, Utils.dp2px(this, 2f), false)) 49 | recycler_view.adapter = imageAdapter 50 | } 51 | 52 | override fun onImageResult(imageItems: ArrayList) { 53 | (recycler_view.adapter as ImageAdapter).updateData(imageItems) 54 | } 55 | 56 | override fun onDestroy() { 57 | super.onDestroy() 58 | ImagePicker.clear()//清除缓存已选择的图片 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/huburt/imagepicker/MainJavaActivity.java: -------------------------------------------------------------------------------- 1 | package com.huburt.imagepicker; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.GridLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | import android.widget.Button; 10 | import android.widget.CheckBox; 11 | import android.widget.CompoundButton; 12 | 13 | import com.huburt.library.ImagePicker; 14 | import com.huburt.library.bean.ImageItem; 15 | import com.huburt.library.util.Utils; 16 | import com.huburt.library.view.GridSpacingItemDecoration; 17 | 18 | import org.jetbrains.annotations.NotNull; 19 | 20 | import java.util.ArrayList; 21 | 22 | /** 23 | * Created by hubert 24 | *

25 | * Created on 2017/10/31. 26 | *

27 | * 这个类与MainActivity的java实现,内容完全相同 28 | */ 29 | 30 | public class MainJavaActivity extends AppCompatActivity implements ImagePicker.OnPickImageResultListener { 31 | 32 | private ImageAdapter adapter; 33 | 34 | @Override 35 | protected void onCreate(@Nullable Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_main); 38 | //使用自定义默认参数或者默认参数 39 | ImagePicker.defaultConfig(); 40 | //临时改变选择图片参数 41 | // ImagePicker.limit(12); 42 | //默认不裁剪 43 | CheckBox cb_crop = (CheckBox) findViewById(R.id.cb_crop); 44 | cb_crop.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 45 | @Override 46 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 47 | ImagePicker.isCrop(isChecked); 48 | } 49 | }); 50 | CheckBox cb_multi = (CheckBox) findViewById(R.id.cb_multi); 51 | cb_multi.setChecked(true);//默认是多选 52 | cb_multi.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 53 | @Override 54 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 55 | ImagePicker.multiMode(isChecked); 56 | } 57 | }); 58 | Button btn_pick = (Button) findViewById(R.id.btn_pick); 59 | btn_pick.setOnClickListener(new View.OnClickListener() { 60 | @Override 61 | public void onClick(View v) { 62 | //选择图片,第二次进入会自动带入之前选择的图片(未重置图片参数) 63 | ImagePicker.pick(MainJavaActivity.this, MainJavaActivity.this); 64 | } 65 | }); 66 | Button btn_camera = (Button) findViewById(R.id.btn_camera); 67 | btn_camera.setOnClickListener(new View.OnClickListener() { 68 | @Override 69 | public void onClick(View v) { 70 | //直接打开相机 71 | ImagePicker.camera(MainJavaActivity.this, MainJavaActivity.this); 72 | } 73 | }); 74 | RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 75 | recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); 76 | adapter = new ImageAdapter(new ArrayList()); 77 | adapter.setListener(new ImageAdapter.OnItemClickListener() { 78 | @Override 79 | public void onItemClick(int position) { 80 | //回顾已选择图片,可以删除 81 | ImagePicker.review(MainJavaActivity.this, position, MainJavaActivity.this); 82 | } 83 | }); 84 | recyclerView.addItemDecoration(new GridSpacingItemDecoration(3, Utils.dp2px(this, 2f), false)); 85 | recyclerView.setAdapter(adapter); 86 | } 87 | 88 | @Override 89 | public void onImageResult(@NotNull ArrayList imageItems) { 90 | adapter.updateData(imageItems); 91 | } 92 | 93 | @Override 94 | protected void onDestroy() { 95 | super.onDestroy(); 96 | ImagePicker.clear();//清除缓存已选择的图片 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 19 | 20 | 26 | 27 | 28 | 32 | 33 |