# 详细用法 ## 一、添加依赖 #### Step 1. 在你project层级的build.gradle中,添加仓库地址: ``` allprojects { repositories { ... mavenCentral() } } ``` #### Step 2. 在你app的build.gradle中添加依赖: 当前最新版本为:Maven ``` dependencies { // 必选:框架 implementation 'com.gouqinglin:BigImageViewPager:版本号' // 必选:Glide def glideVersion = "4.16.0" implementation "com.github.bumptech.glide:glide:$glideVersion" annotationProcessor "com.github.bumptech.glide:compiler:$glideVersion" implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion" // 必选:ExoPlayer (Media3) def media3Version = "1.4.1" implementation "androidx.media3:media3-exoplayer:$media3Version" implementation "androidx.media3:media3-exoplayer-dash:$media3Version" implementation "androidx.media3:media3-ui:$media3Version" } ``` #### Step 3. 在你app中添加AppGlideModule。需要继承AppGlideModule并添加以下代码到对应的重载方法中,例如: ``` @GlideModule public class MyAppGlideModule extends AppGlideModule { @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { super.registerComponents(context, glide, registry); // 替换底层网络框架为okhttp3,这步很重要!如果不添加会无法正常显示原图的加载百分比,或者卡在1% // 如果你的app中已经存在了自定义的GlideModule,你只需要把这一行代码,添加到对应的重载方法中即可。 registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(ProgressManager.getOkHttpClient())); } } ``` #### Step 4. 以上操作完成后,请点击顶部按钮:Build->Rebuild Project,等待重建完成,至此,框架添加完成。如遇到任何问题,请附带截图提issues,我会及时回复,或添加底部QQ群,进行交流。 #### Step 5. 针对Android 16KB对齐问题,本库已完成支持,如果您的AGP(Android gradle plugin)版本低于8.5.1,还需要在app模块的build.gradle中额外增加以下配置,否则会显示支持16KB,但NON 16KB STORED: ``` # 参见:https://developer.android.com/guide/practices/page-sizes?hl=zh-cn packagingOptions { jniLibs { useLegacyPackaging true } } ``` ## 二、调用方式 #### 1:生成图片源: ``` ImageInfo imageInfo; final List imageInfoList = new ArrayList<>(); for (String image : images) { imageInfo = new ImageInfo(); imageInfo.setType(Type.VIDEO);// 指定媒体类型:VIDEO/IMAGE imageInfo.setOriginUrl(url);// 原图url imageInfo.setThumbnailUrl(thumbUrl);// 缩略图url imageInfoList.add(imageInfo); } ``` #### 2:最简单的调用方式: ``` // 最简单的调用,即可实现大部分需求,如需定制,可参考Demo相关代码: ImagePreview .getInstance() .setContext(MainActivity.this) .setMediaInfoList(imageInfoList) .start(); ``` #### 3:自定义多种配置,请查看Demo相关代码 MainActivity.java #### 4:加载策略介绍 ``` enum class LoadStrategy { /** * 仅加载原图;会强制隐藏查看原图按钮 */ AlwaysOrigin, /** * 仅加载普清;会强制隐藏查看原图按钮 */ AlwaysThumb, /** * 根据网络自适应加载,WiFi原图,流量普清;会强制隐藏查看原图按钮 */ NetworkAuto, /** * 手动模式:默认普清,点击按钮再加载原图;会根据原图、缩略图url是否一样来判断是否显示查看原图按钮 */ Default, /** * 全自动模式:WiFi原图,流量下默认普清,可点击按钮查看原图 */ Auto } ``` 注:以上所有方式,如果原图缓存存在,会默认加载原图缓存保证清晰度;且原图缓存只要存在,就不会显示查看原图按钮。 #### 5:完全自定义预览界面布局: 详细操作请参考Demo: #### 6:Q\&A 1.查看原图卡在1%? 答:请仔细查看以上第三步的操作。 2.我想展示后,动态更新某些item/删除某些item,比如,更新图片为视频、更新图片或视频的地址,该如何做? 答:框架提供了更新数据源的方法,使用示例如下: ``` // 删除,执行删除后,会自动选中前一张,并触发onPageSelected回调;如果全部都被删除,会自动关闭预览界面 ImagePreview.getInstance().getPreviewActivity().deleteItem(position); // 更新 ImagePreview.getInstance().getPreviewActivity().updateItem(position, "new url"); ImagePreview.getInstance().getPreviewActivity().updateItem(position, "new thumbnail url", "new origin url"); ImagePreview.getInstance().getPreviewActivity().updateItem(position, "new thumbnail url", "new origin url", Type.IMAGE / Type.VIDEO); ImagePreview.getInstance().getPreviewActivity().updateItem(position, newImageInfo); 例如: ImageInfo imageInfo = new ImageInfo(); imageInfo.setOriginUrl("https://cdn.jeff1992.com/av/ai/video/2024/upload/am_f34ca072f2e0812204233934085111dd.mp4"); imageInfo.setThumbnailUrl("https://cdn.jeff1992.com/av/ai/video/2024/upload/am_f34ca072f2e0812204233934085111dd.mp4"); imageInfo.setType(Type.VIDEO); ImagePreview.getInstance().getPreviewActivity().updateItem(position, imageInfo); ``` 3.如果你们服务器的图片url不会变动但图片内容可能变动,需要每次都走网络加载(即跳过缓存),可以设置setSkipLocalCache来跳过本地的缓存。 注意,跳过缓存可能导致缩略图和原图加载功能出现异常;但如果你没有缩略图和原图需求,就没有影响。 除了使用setSkipLocalCache来跳过本地的缓存外,你还可以使用url拼接一个随机的参数来实现跳过缓存的效果;例如,在末尾拼接时间戳等。