diff --git a/README.md b/README.md index 9aabce6..e71340b 100644 --- a/README.md +++ b/README.md @@ -1,174 +1,190 @@ -# PictureSelector +## PictureSelector -这是一个仿微信的图片选择器。 +这是仿微信的图片选择器。 -效果图: +### 简介 -* 选择界面 +1、来源:相机,本地图片媒体库中jpg和png类型的图片 -![](screenshot/main.png) +2、功能:**多选、单选、拍照、预览、裁剪、大图、支持7.0** -* 预览界面 +3、TODO:增加**直接拍照裁剪类型,多选时图片编辑功能,视频选择功能** -![](screenshot/review.png) - -* 裁剪界面 - -![](screenshot/crop.png) - -* 选择文件目录界面 - -![](screenshot/folder.png) - -## Features - -1、图片来源:拍照,本地图片媒体库中jpg和png类型的图片 - -2、功能:多选、单选、拍照、预览、裁剪 - -3、todo:优化细节(一些动画)、整理解析文档 - -## Demo下载地址 +### Demo下载 ![](screenshot/ps_icon.png) [PicSelector下载地址](app/PicSelector.apk) -## Usage +![](screenshot/use_sample.png) -1、引用Lib(Android studio) +### 使用方式 -通过引用Module方式引用,这样会更方便定制 +#### 引用 -* 在AndroidManifest.xml文件中添加: +**1、在根目录的build.gradle中加入如下配置** ``` - - - -... - - - - - - - - - - - +allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + maven { url "https://dl.bintray.com/thelasterstar/maven/" } + } +} ``` -注意:provider的android:authorities属性把项目包名换成该项目的包名,因为在手机中,这个属性是不能重复的。 - -2、修改默认配置 +**2、在要是用的module中增加如下引用** ``` -//这是默认设置 -PSConfigUtil.getInstance().setCanCrop(false) - .setCanTakePhoto(true) - .setMaxCount(9) - .setStatusBarColor(R.color.ps_colorPrimaryDark); +dependencies { + ... + compile 'com.github.arvinljw:PictureSelector:v2.0.1' +} ``` -* setCanCrop 是否能裁剪,只有maxCount为1时才有效; -* setCanTakePhoto 是否支持拍照; -* setMaxCount 设置一次最多可选择图片的数量; -* setStatusBarColor 设置状态栏颜色,默认为值"#2f3034"。 -3、启动PictureSelector: +*注:该库引用的第三方代码* -``` -private final int REQUEST_CODE_1 = 1001; -private ArrayList selectedImages; -... -PSConfigUtil.getInstance().showSelector(MainActivity.this, REQUEST_CODE_1, selectedImages); -//或者不传参数,注意传递已选择图片的大小不能超过设置的最大数量 -PSConfigUtil.getInstance().showSelector(MainActivity.this, REQUEST_CODE_1); -``` +* v7 +* recyclerview +* annotations +* exifinterface +* glide -4、启动拍照 +前四个都是com.android.support下边的,版本是**26.1.0**,glide使用版本**4.4.0** -``` -private final int REQUEST_CODE_2 = 1002; -PSConfigUtil.getInstance().showTakePhotoAndCrop(MainActivity.this, REQUEST_CODE_2); -``` - -5、接收选择的图片数据: +若是引用的包重复可使用类似这样使用 ``` - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - switch (requestCode) { - case REQUEST_CODE_1: { - selectedImages.clear(); - List temp = data.getParcelableArrayListExtra(PSConstanceUtil.PASS_SELECTED); - selectedImages.addAll(temp); - - PSGlideUtil.loadImage(this, "file://" + temp.get(0).getPath(), img); - for (ImageEntity selectedImage : selectedImages) { - Log.d("back_data", selectedImage.getPath()); - } - break; - } - case REQUEST_CODE_2: { - selectedImages.clear(); - List temp = data.getParcelableArrayListExtra(PSConstanceUtil.PASS_SELECTED); - selectedImages.addAll(temp); - - PSGlideUtil.loadImage(this, "file://" + temp.get(0).getPath(), img); - for (ImageEntity selectedImage : selectedImages) { - Log.d("back_data", selectedImage.getPath()); - } - break; - } - } - } +dependencies { + ... + compile ('com.github.arvinljw:PictureSelector:v2.0.1'){ + exclude group: 'com.android.support' } +} ``` -6、清除图片缓存(删除) +**3、在AndroidManifest文件中添加权限以及必须配置** -* 清除裁剪图片: +**权限** ``` -PSCropUtil.clear(); -``` -* 清除拍照图片 - -``` -PSTakePhotoUtil.clear(); + + + ``` -* 清除所有 +**配置** ``` -PSConfigUtil.clearCache(); -``` - -## Thanks - -* 图片预览在[PhotoView](https://github.com/chrisbanes/PhotoView)的基础上做了一定的修改; -* 图片裁剪使用了鸿洋大神的[仿微信头像裁剪](http://blog.csdn.net/lmj623565791/article/details/39761281),加载和裁剪算法并做了一定的修改。 -* 大图显示使用了[SubsamplingScaleImageView](https://github.com/davemorrissey/subsampling-scale-image-view),并增加裁剪(还有优化空间) -* 图片加载使用Glide -* 事件传递使用Eventbus -* 异步操作使用了Rxjava和Rxandroid - -在此表示感谢! - -## License + + + + +``` + +#### 使用 + +本库依然采用外观模式提供了一个[SelectorHelper](selectorlibrary/src/main/java/net/arvin/selector/SelectorHelper.java),里边有一系列的静态方法去启动选择器,只是传递参数不同而已。 + +但是到最后都调用一个方法,所以只需要告诉大家这一个方法及其参数就能够比较好的使用了。 + +``` +/** + * 去选择图片或视频 + * + * @param type 可选值{@link #VALUE_TYPE_PICTURE}{@link #VALUE_TYPE_VIDEO}{@link #VALUE_TYPE_PICTURE_VIDEO} + * @param singleSelection 是否单选 + * @param canCrop 是否裁剪 + * @param maxCount 最大数量 + * @param withCamera 是否带相机 + * @param selectedPictures 已选中图片 + * @param selectedVideos 已选中视频 + */ +private static void select(Activity activity, int type, boolean singleSelection, boolean canCrop, int maxCount, boolean withCamera, + ArrayList selectedPictures, ArrayList selectedVideos, int requestCode) { + Intent intent = new Intent(activity, SelectorActivity.class); + Bundle bundle = new Bundle(); + bundle.putInt(KEY_TYPE_SELECT, type); + bundle.putBoolean(KEY_SINGLE_SELECTION, singleSelection); + bundle.putBoolean(KEY_CAN_CROP, canCrop); + bundle.putInt(KEY_MAX_COUNT, maxCount); + bundle.putBoolean(KEY_WITH_CAMERA, withCamera); + if (selectedPictures != VALUE_SELECTED_PICTURES_NULL) { + bundle.putStringArrayList(KEY_SELECTED_PICTURES, selectedPictures); + } + if (selectedVideos != VALUE_SELECTED_VIDEOS_NULL) { + bundle.putStringArrayList(KEY_SELECTED_VIDEOS, selectedVideos); + } + bundle.putString(KEY_AUTHORITIES, PSUtil.getAuthorities(activity)); + intent.putExtras(bundle); + activity.startActivityForResult(intent, requestCode); +} +``` + +其实方法贴出来,也有注释就不用多说大家都明白了。**这里暂时还只支持选择图片。** + +``` +/** + * 单选图片,不裁剪,带相机 + */ +public static void selectPicture(Activity activity, int requestCode) { + selectPicture(activity, VALUE_CAN_CROP_FALSE, VALUE_WITH_CAMERA_TRUE, requestCode); +} +/** + * 单选图片 + * + * @param canCrop 选择是否裁剪 + * @param withCamera 选择是否带相机 + */ +public static void selectPicture(Activity activity, boolean canCrop, boolean withCamera, int requestCode) { + select(activity, VALUE_TYPE_PICTURE, VALUE_SINGLE_SELECTION_TRUE, canCrop, VALUE_COUNT_SINGLE, withCamera, + VALUE_SELECTED_PICTURES_NULL, VALUE_SELECTED_VIDEOS_NULL, requestCode); +} +/** + * 多选图片,带相机 + * + * @param maxCount 多选的最大数量 + */ +public static void selectPictures(Activity activity, int maxCount, int requestCode) { + selectPictures(activity, maxCount, VALUE_WITH_CAMERA_TRUE, VALUE_SELECTED_PICTURES_NULL, requestCode); +} +/** + * 多选图片 + * + * @param maxCount 多选的最大数量 + * @param withCamera 选择是否带相机 + * @param selectedPictures 已选中的图片 + */ +public static void selectPictures(Activity activity, int maxCount, boolean withCamera, ArrayList selectedPictures, int requestCode) { + select(activity, VALUE_TYPE_PICTURE, VALUE_SINGLE_SELECTION_FALSE, VALUE_CAN_CROP_FALSE, maxCount, withCamera, + selectedPictures, VALUE_SELECTED_VIDEOS_NULL, requestCode); +} +``` + +也就是说这四个静态方法是可以使用的,多选时暂时不支持裁剪,之后会想微信一样增加编辑功能。 + +最后在onActivityResult中可以获得选中的图片,当然顺序是选择图片时的顺序。 + +``` +ArrayList backPics = data.getStringArrayListExtra(ConstantData.KEY_BACK_PICTURES); +``` +这样就获取到选中的图片了,不管单选多选都这样,只是单选就只有一张。 + +当然6.0以上的访问相机和本地文件的权限需要自己去实现,demo中也提供了一种方式,仅供参考。 + +若是有什么问题,希望不吝赐教共同进步~ + +### License ``` Copyright 2016 arvinljw diff --git a/app/build.gradle b/app/build.gradle index f5174f1..d084043 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,16 @@ apply plugin: 'com.android.application' android { - def android = rootProject.ext.android - compileSdkVersion android.compileSdkVersion as int + def version = rootProject.ext.version + compileSdkVersion version.compileSdkVersion as int buildToolsVersion android.buildToolsVersion as String defaultConfig { - minSdkVersion android.minSdkVersion as int - targetSdkVersion android.targetSdkVersion as int - versionCode android.versionCode as int - versionName android.versionName as String + applicationId "net.arvin.selectordemp" + minSdkVersion version.minSdkVersion as int + targetSdkVersion version.targetSdkVersion as int + versionCode version.versionCode as int + versionName version.versionName as String } buildTypes { release { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ecb578..b65b7e9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="net.arvin.selectordemo"> @@ -14,9 +14,17 @@ android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + + + + - - - - - - - -