【Android】弹框图片选择器,支持裁剪圆形矩形和矩形裁剪
Android 7.0
以上,在manifest
的application
下(和activity
同级)加入以下代码
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
并在res
下新建xml
目录,新建provider_paths.xml
文件,内容如下:
其中的com.dubhe.headerselector
建议替换为你自己的项目名称。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="images"
path="Android/data/com.dubhe.headerselector/files/Pictures/OriPicture/" />
<external-path
name="images"
path="Android/data/com.dubhe.headerselector/files/Pictures/OriPicture/" />
<external-files-path
name="images"
path="files/Pictures/OriPicture" />
</paths>
支持链式调用
ImageSelector.getInstance(mActivity)//初始化图片选择器对象,参数是Activity或Fragment对象
.setEnableClip(true)//是否裁剪图片
.setClipMode(ClipImageActivity.TYPE_CIRCLE)//裁图模式 TYPE_CIRCLE圆形 TYPE_RECTANGLE矩形
.setOnProcessFinishListener(new HeaderSelector.OnProcessFinishListener() {
//完成所有操作后返回最终结果的path
//TODO:不set将会导致无法拿到返回结果
@Override
public void onProcessFinish(String path) {
//TODO:拿到path进行逻辑操作
}
});
重写onActivityResult
方法来接收回调数据,写在调用的Fragment
和Activity
中。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ImageSelector.getInstance(mActivity).onHeaderResult(requestCode, resultCode, data);
}
最终选择/裁剪后得到的图片path
将从onProcessFinish
方法中返回
ImageSelector.getInstance(mActivity).showImageSelectMenu();//弹出图片选择器菜单
在调用的Activity
或Fragment
的onDestroy
方法中调用以下方法避免报空并回收资源
@Override
protected void onDestroy() {
super.onDestroy();
ImageSelector.getInstance(this).clear();
}
裁剪器的圆形矩形仅为裁剪框的形状,仅便于用户定位,并不会把图片内容变成圆形。 如果要显示圆形的图片请使用图片加载框架的相关功能 例:Glide 4.9加载圆形图片
Glide.with(context).load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);
若业务需要在点击一个按钮时除了视频和图片以外显示其他的选项(例如文字和图片),可以直接在ImageSelector中添加。
ImageSelector.getInstance(mActivity)//初始化图片选择器对象,参数是Activity或Fragment对象
.setOnProcessFinishListener(new HeaderSelector.OnProcessFinishListener() {
//完成所有操作后返回最终结果的path
//TODO:不set将会导致无法拿到返回结果
@Override
public void onProcessFinish(String path) {
//TODO:拿到path进行逻辑操作
}
});
.addItem(ImgTextOptionModel(R.drawable.vec_video_file, "视频"))//第一个参数是图标,第二个参数是文本标签。会添加到底部
.setOnCustomItemClickListener { text, position ->
//此处会返回文本标签和位置下标两个参数用于定位,建议使用文本标签进行判断
when (text) {
"视频" -> {
//TODO:进行选择视频的操作
}
}
}