博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个非常好看的图片选择框架LPhotoPicker,确定不来看看么
阅读量:6267 次
发布时间:2019-06-22

本文共 4981 字,大约阅读时间需要 16 分钟。

国际惯例,先上地址

LPhotoPicker

这是一个漂亮的、纯粹的图片选择框架,对对kotlin的良好支持,java也可使用。不带裁剪、不带压缩、不带权限管理,没有冗余的第三方库,只为最纯粹的使用,让你更灵活与其他裁剪、压缩库组合使用。

如果你喜欢毛玻璃效果、如果你想拥有最大化的自定义,那么这个库你不容错过。

如果需要图片裁剪,推荐uCrop开源库组合使用

欢迎在中提出问题、建议

预览

模拟器刘海屏

demo下载地址

获取

先在 build.gradle 的 repositories 添加仓库:

allprojects {	repositories {		...		maven { url 'https://jitpack.io' }	}}复制代码

再在dependencies添加:

最新版本请前往github获取

dependencies {		implementation 'com.github.limuyang2:LPhotoPicker:版本号'}复制代码

在build.gradle中添加以下配置:

android {    compileSdkVersion 27    defaultConfig {        ………………        //添加以下两句代码        renderscriptTargetApi 27  //版本号请与compileSdkVersion保持一致        renderscriptSupportModeEnabled true    }}复制代码

使用

使用前,记得获取权限!‘Manifest.permission.WRITE_EXTERNAL_STORAGE‘’,因为小伙伴们各自的项目中所使用的权限框架不同,所以库中再集成的话会显得非常臃肿多余。

以下均以kotlin为示例,java的写法基本无差别,不在单独列出

以下选项根据需要选择性添加:

val intent = LPhotoPickerActivity.IntentBuilder(this)               .maxChooseCount(3) //最大多选数目               .columnsNumber(4) //以几列显示图片               .imageType(LPPImageType.ofAll()) //需要显示的图片类型(webp/PNG/GIF/JPG)               .pauseOnScroll(false) //滑动时,是否需要暂停图片加载               .isSingleChoose(false) //单选模式               .imageEngine(LGlideEngine()) //添加自定义的图片加载引擎(库中已经自带Glide加载引擎,如果你不需要自定义,可不添加此句)               .theme(theme) //主题               .selectedPhotos(ArrayList
()) //已选择的图片数组 .build()startActivityForResult(intent, CHOOSE_PHOTO_REQUEST)复制代码

在activityonActivityResult中接收数据

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        if (resultCode == RESULT_OK) {            when (requestCode) {                CHOOSE_PHOTO_REQUEST -> {                    val selectedPhotos = LPhotoPickerActivity.getSelectedPhotos(data)                }        }}复制代码

自定义图片加载引擎框架

库中已经编写了Glide加载引擎,如果需要自定义其他图片加载框架的,可参照自己重写。

继承LImageEngine接口,重写其中的方法即可(以Glide为例子):

class LGlideEngine : LImageEngine {
private val glideOptions by lazy { RequestOptions().centerCrop() } override fun load(context: Context, imageView: ImageView, path: String?, @DrawableRes placeholderRes: Int, resizeX: Int, resizeY: Int) { Glide.with(context) .load(path) .apply(glideOptions.placeholder(placeholderRes).override(resizeX, resizeY)) .into(imageView) } //pauseOnScroll打开时,以下两个必须写,否"滑动时暂停加载"不会生效 //加载暂停 override fun pause(context: Context) { Glide.with(context).pauseRequests() } //恢复加载 override fun resume(context: Context) { Glide.with(context).resumeRequestsRecursive() }}复制代码

更改主题

简单设置,仅需一次性固定设置的

style文中重写以下内容即可(style名字必须为LPhotoTheme):

复制代码

动态设置主题,需要多种风格切换的(例如主题切换的情况)

同上先在xm中定义属性,但style名字可以随意:

复制代码

在代码中调用theme()方法设置xml主题:

LPhotoPickerActivity.IntentBuilder(this)	……	.theme(R.style.MyDarkTheme)	.build()复制代码

混淆

本库所有内容,除Glide外,均可以混淆,已经过测试。

添加如下Glide混淆规则即可:(如果自定义了其他图片加载库,请自行添加混淆内容即可)

#glide 4.x-keep class com.bumptech.glide.Glide { *; }-keep public class * implements com.bumptech.glide.module.GlideModule-keep public class * extends com.bumptech.glide.module.AppGlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {  **[] $VALUES;  public *;}复制代码

附录:配合使用uCrop

先添加库, 然后在onActivityResult中接收数据后,传递给uCrop即可

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        if (resultCode == RESULT_OK) {            when (requestCode) {                CHOOSE_PHOTO_REQUEST -> {                    val selectedPhotos = LPhotoPickerActivity.getSelectedPhotos(data)                    if(selectedPhotos.size == 1) {                        //使用UCrop裁剪图片                        val outUri = Uri.fromFile(File(cacheDir, "${System.currentTimeMillis()}.jpg"))                        UCrop.of(Uri.fromFile(File(selectedPhotos[0])), outUri)                            .withAspectRatio(1f, 1f)                            .withMaxResultSize(800, 800)                            .start(this)                    }                }                                //接收uCrop的参数                UCrop.REQUEST_CROP   -> {                    data?.let {                        val resultUri = UCrop.getOutput(data)                        Log.d("UCrop.REQUEST_CROP", resultUri.toString())                        Glide.with(this).load(resultUri).into(imgView)                    }                }        }}复制代码

使用步骤很简单,具体的使用都可以参照demo

License

2018 limuyangLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at   http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.复制代码

转载地址:http://pwjpa.baihongyu.com/

你可能感兴趣的文章
BBS论坛(二十七)
查看>>
html DOM 的继承关系
查看>>
装饰器的邪门歪道
查看>>
Dubbo常用配置解析
查看>>
【转】C#解析Json Newtonsoft.Json
查看>>
macports的安装及常用命令
查看>>
(转)使用C#开发ActiveX控件
查看>>
spring mvc 基于注解 配置默认 handlermapping
查看>>
半小时学会上传本地项目到github
查看>>
Android学Jni/Ndk 开发记录(一)
查看>>
Linux Tcl和Expect的安装
查看>>
WPF中的依赖项属性(转)
查看>>
linux防火墙相关 iptables
查看>>
最简单的单例模式
查看>>
JPopupMenu的使用以及JPopupMenu中子组件的事件处理
查看>>
从反汇编的角度看引用和指针的区别
查看>>
拓马长枪定乾坤
查看>>
UIProgressView的详细使用
查看>>
Silverlight实用窍门系列:70.Silverlight的视觉状态组VisualStateGroup
查看>>
照片筛选与上传功能
查看>>