文档章节

Android 图片选择器 进阶版

YancyYe
 YancyYe
发布于 2016/11/03 14:35
字数 1600
阅读 65
收藏 0

GalleryPick 图片选择器

GalleryPick 是 Android 自定义相册,实现了拍照、图片选择(单选/多选)、裁剪、ImageLoader无绑定 任由开发者选择

各位的 star 就是对我最大的支持。

###GitHub 项目地址 ###下载 APK

图片展示

功能 多选页面 文件夹选择 截图

Gif展示

单选 多选 截图

GalleryPick 功能

  • UI重改
  • 所有功能可配置
  • 解决OOM情况
  • 图片多选、单选
  • ImageLoader 无绑定,任由开发者选择
  • 可直接开启相机
  • 可裁剪、可旋转

版本说明

1.1.2

  • 添加通过覆盖资源的方式,修改截图页面的配色。(使用方法参考

使用说明

步骤一:

本开源代码以关联到 jitpack 网站 ,使用者可以用以下几种方式进行抓取。

通过Gradle使用

Projectbuild.gradle 中 添加:

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}

appbuild.gradle 中 添加:

dependencies {
      compile 'com.github.YancyYe:GalleryPick:1.1.2'
}

通过maven使用

<repositories>
	<repository>
	    <id>jitpack.io</id>
	    <url>https://jitpack.io</url>
	</repository>
</repositories>
<dependency>
    <groupId>com.github.YancyYe</groupId>
    <artifactId>GalleryPick</artifactId>
    <version>1.1.2</version>
</dependency>

步骤二:创建 图片加载器 (其中可以按照 喜好 使用不同的 第三方图片)

####示例: ####使用Glide加载 ####使用Picasso加载 ####使用Fresco加载

步骤三:申请权限

代码示例: 在点击开启相册按钮时:

if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG, "需要授权 ");
            if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                Log.i(TAG, "拒绝过了");
                // 提示用户如果想要正常使用,要手动去设置中授权。
                Toast.makeText(mContext, "请在 设置-应用管理 中开启此应用的储存授权。", Toast.LENGTH_SHORT).show();
            } else {
                Log.i(TAG, "进行授权");
                ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_READ_CONTACTS);
            }
        } else {
            Log.i(TAG, "不需要授权 ");
            // 进行正常操作
        }
}

以下是用户授权反馈

Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
	if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
		if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
		    Log.i(TAG, "同意授权");
		    // 进行正常操作。
		} else {
		    Log.i(TAG, "拒绝授权");
		}
	}
}

步骤四:创建监听接口IHandlerCallBack

IHandlerCallBack iHandlerCallBack = new IHandlerCallBack() {
           @Override
           public void onStart() {
               Log.i(TAG, "onStart: 开启");
           }

           @Override
           public void onSuccess(List<String> photoList) {
               Log.i(TAG, "onSuccess: 返回数据");
               for (String s : photoList) {
                   Log.i(TAG, s);
               }
           }

           @Override
           public void onCancel() {
               Log.i(TAG, "onCancel: 取消");
           }

           @Override
           public void onFinish() {
               Log.i(TAG, "onFinish: 结束");
           }

           @Override
           public void onError() {
               Log.i(TAG, "onError: 出错");
            }
};

步骤五:配置 GalleryConfig

可先进行初始配置,除了ImageLoaderIHandlerCallBack之外,其他都是选填,都有默认值。

GalleryConfig galleryConfig = new GalleryConfig.Builder()
                .imageLoader(new GlideImageLoader())    // ImageLoader 加载框架(必填)
                .iHandlerCallBack(iHandlerCallBack)     // 监听接口(必填)
                .pathList(path)                         // 记录已选的图片
                .multiSelect(false)                      // 是否多选   默认:false
                .multiSelect(false, 9)                   // 配置是否多选的同时 配置多选数量   默认:false , 9
                .maxSize(9)                             // 配置多选时 的多选数量。    默认:9
                .crop(false)                             // 快捷开启裁剪功能,仅当单选 或直接开启相机时有效
                .crop(false, 1, 1, 500, 500)             // 配置裁剪功能的参数,   默认裁剪比例 1:1
                .isShowCamera(true)                     // 是否现实相机按钮  默认:false
                .filePath("/Gallery/Pictures")          // 图片存放路径
                .build();

可以按照需求进行单项配置,前提需要填好 ImageLoaderIHandlerCallBack,举例:

  galleryConfig.getBuilder().multiSelect(true).build();   // 修改多选
  galleryConfig.getBuilder().isShowCamera(true).build();   // 修改显示相机
  galleryConfig.getBuilder().imageLoader(new PicassoImageLoader()).build(); // 修改图片加载框架

步骤六:启动GalleryPick图片选择器

GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);

其他功能使用方法说明:

一:裁剪功能使用说明

注意:裁剪功能只能在单选时、直接开启相机时生效。

GalleryConfig galleryConfig = new GalleryConfig.Builder()
                .imageLoader(new GlideImageLoader())    // ImageLoader 加载框架(必填)
                .iHandlerCallBack(iHandlerCallBack)     // 监听接口(必填)
                .pathList(path)                         // 记录已选的图片
                .crop(true)                             // 快捷开启裁剪功能,仅当单选 或直接开启相机时有效
                .isShowCamera(true)                     // 是否现实相机按钮  默认:false
                .filePath("/Gallery/Pictures")          // 图片存放路径
                .build();
GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);

如果需要自定义裁剪框的比例,可按照以下方法设置:

GalleryConfig galleryConfig = new GalleryConfig.Builder()
                .imageLoader(new GlideImageLoader())    // ImageLoader 加载框架(必填)
                .iHandlerCallBack(iHandlerCallBack)     // 监听接口(必填)
                .pathList(path)                         // 记录已选的图片
                 .crop(true, 1, 1, 500, 500)           // 配置裁剪功能的参数,   默认裁剪比例 1:1
                .isShowCamera(true)                     // 是否现实相机按钮  默认:false
                .filePath("/Gallery/Pictures")          // 图片存放路径
                .build();
GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);

裁剪图片存放在 filePath 文件夹下的 crop 目录下。内部创建了忽略文件,手机系统扫描不到此文件目录下的媒体文件,防止裁剪图片显示在相册中,影响心情。

####二:直接开启相机,其中有三种方法。 #####方法一: 在 GalleryConfig 中设置直接开启相机的标识位。

GalleryConfig galleryConfig = new GalleryConfig.Builder()
          .iHandlerCallBack(iHandlerCallBack)     // 监听接口(必填)
          .filePath("/Gallery/Pictures")          // 图片存放路径   (选填)
          .isOpenCamera(true)                  // 直接开启相机的标识位
          .build();

GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);

#####方法二: 如果已经设置好了 GalleryConfig 可以使用单项参数修改的方法来开启相机。

galleryConfig.getBuilder().isOpenCamera(true).build();
GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);

#####方法三: 为了方便使用,在不变动开启相册的GalleryConfig的情况下,我还添加了以下方法。

 GalleryPick.getInstance().setGalleryConfig(galleryConfig).openCamera(mActivity);

这个方法可以直接使用。不需要在GalleryConfig中添加标志位,或者进行单项修改。方便用户使用。

####三:深度自定义UI方法 可能有很多用户对 GalleryPick 里面的界面还有些不满意。没关系,接下来我来教大家如何自己定义其中的颜色。

下面举个简单的例子: #####1) 我在 GalleryPick 中的 gallery_title.xml 中设置了标题栏的颜色为 @color/gallery_blue 用户可以在 app 中的 colors.xml 中定义一个名为 gallery_blue 的颜色:

<resources>
    <color name="gallery_blue">#FF4081</color>
</resources>

这样就达到了覆盖资源文件的效果。从而达到自定义UI。

#####2) 有些朋友会问,我标题栏设置了白色,但是标题栏的字体和图标也是白色的,那该怎么办? 下面来讲一下方法,因为是覆盖资源文件,所以在 app 中创建 gallery_title.xml , 先将 GalleryPick 中的 gallery_title.xml 代码copy过去,然后就简单了。将TextViewtextColor中的颜色颜色换一下就好了。同样,返回按钮可以改变一下 ImageViewsrc,很简单。

##旧版本记录

1.1.1

  • 修复直接开启相机所存在的问题

1.1.0

1.0.4

1.0.3

  • 提供单选、多选、以及相机拍照功能。
  • 自定义ImageLoader

感谢(Thanks)

关于作者

###旧项目地址

© 著作权归作者所有

YancyYe
粉丝 0
博文 1
码字总数 1600
作品 0
宁波
私信 提问
Android实战经验之图像处理及特效处理的集锦(总结版)

1 Android学习笔记进阶之在图片上涂鸦(能清屏) 2 Android学习笔记之详细讲解画圆角图片 3 Android学习笔记进阶20之得到图片的缩略图 4 Android学习笔记进阶19之给图片加边框 5 Android学习笔...

xiaosi
2012/03/12
40.2K
25
全平台 Chrome 浏览器正式版更新至 61.0.3163.79 版本

全平台 Chrome 浏览器正式版迎来更新,版本号升级至 61.0.3163.79,主要在 JavaScript 模块、桌面版 Payment Request API、Web Share API 以及 WebUSB 方面做了改进与完善。 Chrome 61 增加了...

akamos01
2017/09/06
4.1K
35
革命性移动端开发框架-Flutter时间简史

说到Flutter,可能很多同学都会将它和这几个词关联起来:新兴的、移动端、动态化、跨平台、开发框架。 从去年开始Flutter的热度在不断地上升,那么它对很多同学造成了一个误区:认为Flutter...

JiaPengHui
03/09
0
0
android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码

Android精选源码 一个爬取美女图片的app(http://www.apkbus.com/thread-600077-1-1.html) Android高仿抖音(http://www.apkbus.com/thread-600081-1-1.html) android一个可以上拉下滑的Ui效果......

逆鳞龙
2018/06/12
187
0
android的selector背景选择器

android的背景选择器selector算是比较常用的了。我们在做页面的时候,系统原生的按钮了,listView的item了,他们在被选中的时候那种屎黄色的背景。。。。。。。 所以我们就会用到selector来设...

Cory
2013/05/28
691
1

没有更多内容

加载失败,请刷新页面

加载更多

Android面试常客之Handler全解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fnhfire_7030/article/details/79518819 前言:又到了一年...

shzwork
8分钟前
0
0
position sticky 定位

本文转载于:专业的前端网站➫position sticky 定位 1、兼容性 https://caniuse.com/#search=sticky chrome、ios和firefox兼容性良好。 2、使用场景 sticky:粘性。粘性布局。 在屏幕范围内时...

前端老手
15分钟前
1
0
CentOS 7 yum 安装 PHP7.3 教程

参考:https://www.mf8.biz/centos-rhel-install-php7-3/ 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release......

dragon_tech
30分钟前
1
0
Linux物理网卡聚合及桥接

Linux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表...

xiangyunyan
30分钟前
1
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

猿敲月下码
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部