OpenImage
🔥🔥🔥查看大图、查看视频、图片浏览器,完美的甚至完胜微信的打开过渡动画,支持手势放大缩小图片,支持下拉手势返回,支持自定义图片加载库,支持自定义视频库,支持自定义所有UI
Install / Use
/learn @FlyJingFish/OpenImageREADME
OpenImage 图片查看大图库
属于你的侵入性低的大图查看器,完美的甚至完胜微信的过渡动画,支持自定义视频播放器,也可以自定义加载图片的内核,例如Glide、Coil、Picasso 或其他的<br><br>如果帮到你点个star推广给更多人吧~
推荐一个库 AndroidAOP 一个注解就可请求权限,禁止多点,切换线程等等
点此下载apk,也可扫下边二维码下载
<img src="/screenshot/download_qrcode.png" alt="show" width="200px" />多种场景效果演示(不限于以下几种,更多支持点此查看)
RecyclerView场景 | 聊天页面 | 打开视频
------ | ------ | ------
<img src="/screenshot/Screenrecording_20230519_124228.gif" alt="show" width="240px" /> | <img src="/screenshot/SVID_20220731_203549_1.gif" alt="show" width="240px" /> | <img src="/screenshot/SVID_20220731_203923_1.gif" alt="show" width="240px" /> |
朋友圈 | 快手 | WebView
------ | ------ | ------
<img src="/screenshot/friends_demo.gif" alt="show" width="240px" /> | <img src="/screenshot/Screenrecording_20230518_165929.gif" alt="show" width="240px" /> | <img src="/screenshot/Screenrecording_20230518_170044.gif" alt="show" width="240px" /> |
特色功能
1、支持自定义图片加载引擎
2、支持多种图片缓存模式
3、支持聊天界面的查看大图功能
4、支持任意定制属于你的大图查看页面UI,多种定制方式总有一种适合你(点此查看更多使用说明)
5、支持打开后的大图页面数据的增、删、改、查(点此查看更多使用说明)
6、支持全部 ImageView.ScaleType 显示模式的图片打开大图效果,并且新增startCrop、endCrop、autoStartCenterCrop、autoEndCenterCrop四种显示模式
7、支持图片和视频混合数据
8、支持传入包含图片的 RecyclerView、ViewPager、ViewPager2、ListView、GridView 和 多个ImageView 的调用方式,甚至 WebView,傻瓜式调用,无需关心图片切换后该返回到哪个位置
9、支持Gif图
10、支持实况图
11、支持长图和长图阅读模式
12、支持显示超大图及放大后的清晰细节图
13、支持视频缩放拖动功能、图片缩放拖动功能
14、支持自定义大图切换效果(PageTransformer)
15、支持 Compose 示例
前言
1、建议使用Glide效果更好,另外建议开启原图缓存(有些版本是自动缓存原图的)Glide通过设置diskCacheStrategy 为DiskCacheStrategy.ALL或DiskCacheStrategy.DATA
2、当然如果您加载的是本地图片可直接忽略第1点
使用步骤
第一步、选择适合你的库
你可以选择下面三种的其中一种,在module下的build.gradle添加。
A、直接引入完整版(同时支持查看图片和视频)
请注意如果使用以下导入方式,如果你的项目组存在GSYVideoPlayer请升级至 11.3.0 或者更高的版本,否则会冲突
- 使用 Glide 作为图片加载器,如果你的项目组存在Glide请升级至 4.12.0 或者更高的版本,否则会冲突
//OpenImageFullLib 默认已经包含了OpenImageGlideLib
implementation 'io.github.flyjingfish:openimage-full:2.5.0'
- 使用 Coil 作为图片加载器,如果你的项目组存在Coil请升级至 2.4.0 或者更高的版本,否则会冲突
//OpenImageFullLib 因为已经包含了 OpenImageGlideLib,所以需要排除掉 OpenImageGlideLib,否则会同时存在 Glide 和 Coil
implementation ('io.github.flyjingfish:openimage-full:2.5.0'){
exclude module: 'OpenImageGlideLib'
}
//OpenImageCoilLib 引入Coil(2.4.0)图片引擎
implementation 'io.github.flyjingfish:openimage-coil:2.5.0'
B、引入只带有图片引擎的版本(只支持查看图片)
在 Glide 和 Coil 中选一个作为图片加载器
- 使用 Glide 作为图片加载器,如果你的项目组存在Glide请升级至 4.12.0 或者更高的版本,否则会冲突
//OpenImageGlideLib 引入Glide(4.12.0)图片引擎,没有引入视频播放器;如需定制视频播放功能,详细看Wiki文档,如果不想定制可直接使用上边的库
implementation 'io.github.flyjingfish:openimage-glide:2.5.0'
- 使用 Coil 作为图片加载器,如果你的项目组存在Coil请升级至 2.4.0 或者更高的版本,否则会冲突
//OpenImageCoilLib 引入Coil(2.4.0)图片引擎,没有引入视频播放器;如需定制视频播放功能,详细看Wiki文档,如果不想定制可直接使用上边的库
implementation 'io.github.flyjingfish:openimage-coil:2.5.0'
C、引入基础版本(不可以直接查看图片和视频,完全需要自定义)
自己定义加载大图时请注意内存溢出问题,详情可看Wiki文档(点此查看常见问题)
//OpenImageLib 是基础库,没有引入图片引擎和视频播放器
//至少需要实现BigImageHelper来定制您的图片引擎,如需定制视频播放功能,详细看Wiki文档
implementation 'io.github.flyjingfish:openimage-base:2.5.0'
第二步. 简单一步调用即可
先确保你有没有添加以下权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Android 13版本适配,细化存储权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
</manifest>
你可以选择下面两种图片数据的其中一种
A、直接将数据转化为 String 的List (这个方式适合只看图片或视频,不可显示混合数据)
List<String> dataList = new ArrayList<>();
for (ImageEntity data : datas) {
dataList.add(data.getImageUrl());
}
//在点击时调用(以下以RecyclerView为例介绍)
OpenImage.with(activity)
//点击ImageView所在的RecyclerView(也支持设置setClickViewPager2,setClickViewPager,setClickGridView,setClickListView,setClickImageView,setClickWebView,setNoneClickView)
.setClickRecyclerView(recyclerView,new SourceImageViewIdGet() {
@Override
public int getImageViewId(OpenImageUrl data, int position) {
return R.id.iv_image;//点击的ImageView的Id或者切换图片后对应的ImageView的Id
}
})
//点击的ImageView的ScaleType类型(如果设置不对,打开的动画效果将是错误的)
.setSrcImageViewScaleType(ImageView.ScaleType.CENTER_CROP,true)
//RecyclerView的数据
.setImageUrlList(dataList, MediaType.IMAGE)
//点击的ImageView所在数据的位置
.setClickPosition(position)
//开始展示大图
.show();
在此着重再介绍下 SourceImageViewIdGet 在这是动态获取 ImageView 的Id的,如果你的 RecyclerView(或ViewPager2、ListView、GridView) 展示的图片 Id 出现多个则需根据 getImageViewId 中的 position 或 data 来返回对应的 Id,例如:
new SourceImageViewIdGet() {
@Override
public int getImageViewId(OpenImageUrl data, int position) {
//data 可强转为您传入的数据类型
MessageBean msgBean = (MessageBean) data;
//在此视频数据和图片数据的 ImageView 的 Id 不一样(根据您具体情况返回对应的Id即可,以下仅为示例~)
if (msgBean.type == MessageBean.IMAGE){
return R.id.iv_image;
}else {
return R.id.iv_video;
}
}
}
B、在您的数据实体类上实现OpenImageUrl接口(这个方式适合显示图片和视频的混合数据,建议使用这个方式)
PS:列表中展示的图片链接和展示大图时所用链接是不同时(即存在缩略图和原始大图两种链接的情况),这种方式可以有更好的过渡效果
public class ImageEntity implements OpenImageUrl {
public String photoUrl;//图片大图
public String smallPhotoUrl;//图片小图
public String coverUrl;//视频封面大图
public String smallCoverUrl;//视频封面小图
public String videoUrl;//视频链接
public int resouceType; //0图片1视频2实况图
@Override
public String getImageUrl() {
return resouceType == 0 ? photoUrl : coverUrl;//大图链接(或视频的封面大图链接)
}
@Override
public String getVideoUrl() {
return videoUrl;//视频链接
}
@Override
public String getCoverImageUrl() {//这个代表前边列表展示的图片(即缩略图)
return resouceType == 0 ? smallPhotoUrl : smallCoverUrl;//封面小图链接(或视频的封面小图链接)
}
@Override
public MediaType getType() {
return resouceType == 1 ? MediaType.VIDEO : (resouceType == 2 ? MediaType.LIVE_PHOTO : MediaType.IMAGE);//数据是图片还是视频
}
}
然后调用显示
//在点击时调用(以下以RecyclerView为例介绍)
OpenImage.with(activity)
//点击ImageView所在的RecyclerView(也支持设置setClickViewPager2,setClickViewPager,setClickGridView,setClickListView,setClickImageView,setClickWebView,setNoneClickView)
.setClickRecyclerView(recyclerView,new SourceImageViewIdGet() {
@Override
public int getImageViewId(OpenImageUrl data, int position) {
return R.id.iv_image;//点击的ImageView的Id或者切换图片后对应的ImageView的Id
}
})
//点击的ImageView的ScaleType类型(如果设置不对,打开的动画效果将是错误的)
.setSrcImageViewScaleType(ImageView.ScaleType.CENTER_CROP,true)
//RecyclerView的数据
.setImageUrlList(datas)
//点击的ImageView所在数据的位置
.setClickPosition(position)
//开始展示大图
.show();
如果没有可以传的View(即不使用动画打开大图页面)
//在点击时调用(以下以RecyclerView为例介绍)
OpenImage.with(activity)
//打开大图页面时没有点击的ImageView则用这个
.setNoneClickView()
//图片的数据
.setImageUrlList(datas)
//默认展示数据的位置
.setClickPosition(position)
//开始展示大图
.show();
PS.完整调用示例 (点此查看更多使用说明)
//在点击时调用,按需使用即可(以下以RecyclerView为例介绍)
OpenImage.with(activity)
//点击ImageView所在的RecyclerView(也支持设置setClickViewPager2,setClickViewPager,setClickGridView,setClickListView,setClickImageView,setClickWebView)
.setClickRecyclerView(recyclerView,new SourceImageViewIdGet() {
@Override
public int getImageViewId(OpenImageUrl data, int position) {
Related Skills
node-connect
345.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
106.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.9kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
