SkillAgentSearch skills...

OpenImage

🔥🔥🔥查看大图、查看视频、图片浏览器,完美的甚至完胜微信的打开过渡动画,支持手势放大缩小图片,支持下拉手势返回,支持自定义图片加载库,支持自定义视频库,支持自定义所有UI

Install / Use

/learn @FlyJingFish/OpenImage
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

OpenImage 图片查看大图库

Maven central GitHub stars GitHub forks GitHub issues GitHub license

属于你的侵入性低的大图查看器,完美的甚至完胜微信的过渡动画,支持自定义视频播放器,也可以自定义加载图片的内核,例如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、支持传入包含图片的 RecyclerViewViewPagerViewPager2ListViewGridView多个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

View on GitHub
GitHub Stars468
CategoryDevelopment
Updated2d ago
Forks52

Languages

Java

Security Score

100/100

Audited on Mar 31, 2026

No findings