Giter Site home page Giter Site logo

hitomis / transferee Goto Github PK

View Code? Open in Web Editor NEW
2.7K 52.0 390.0 202.5 MB

[暂停维护]一个帮助您完成从缩略视图到原视图无缝过渡转变的神奇框架

Java 100.00%
android images transform qq wechat gesture draggable viewpager transferee-imageview transferee

transferee's Introduction

Transferee

transferee 可以帮助你完成从缩略视图到原视图的无缝过渡转变, 优雅的浏览普通图片、长图、gif图、视频等不同格式的多媒体。

支持的功能:

  • 支持视频预览
  • 支持 Gif 图预览
  • 支持大长图预览
  • 支持拖拽关闭
  • 支持自定义页面索引指示器
  • 支持自定义资源加载进度条
  • 支持自定义图片加载器[目前已经有 UniversalImageLoader / GlideImageLoader / PicassoImageLoader]
  • 支持图片保存
  • 支持预览图片缩放,拖动,旋转等手势操作
  • 缩略图到大图或者大图到缩略图的无缝过渡动画,无缩略图信息时,自动改变动画的行为为平移过渡->加载大图->伸展图片动画
  • 支持傻瓜式绑定 RecyclerView / ListView / GridView / ImageView
  • 支持不绑定任何 View, 即可启动 transferee

如有任何问题欢迎提 Issues

Preview

Sample

demo.apk

Dependency

step1.

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

step2.

// 添加所有 module  [包括 Transferee、GlideImageLoader、PicassoImageLoader、UniversalImageLoader]
implementation 'com.github.Hitomis:transferee:1.6.1'

// 单独添加核心 module Transferee, 之后至少还需要添加以下三种图片加载器中的一种
implementation 'com.github.Hitomis.transferee:Transferee:1.6.1'

// 添加 Glide 图片加载器
implementation 'com.github.Hitomis.transferee:GlideImageLoader:1.6.1'

// 添加 Picasso 图片加载器
implementation 'com.github.Hitomis.transferee:PicassoImageLoader:1.6.1'

// 添加 Universal 图片加载器
implementation 'com.github.Hitomis.transferee:UniversalImageLoader:1.6.1'

Usage

如果针对单个 ImageView 使用,将非常简单:

Transferee transfer = Transferee.getDefault(context);
transfer.apply(TransferConfig.build()
        .setImageLoader(UniversalImageLoader.with(getApplicationContext()))
        .setSourceUrlList(SourceConfig.getMixingSourceGroup())
        .create()
).show());

// 离开页面不要忘记调用
transfer.destroy();

如果你需要更多的功能,下面是 transferee 完整的使用示例:

step 1: 一个页面只创建一个 transferee 示例 (建议写在 onCreate 方法中)

transferee = Transferee.getDefault(context);

step 2: 为 transferee 创建参数配置器

TransferConfig config = TransferConfig.build()
       .setSourceImageList(sourceUrlList) // 资源 url 集合, String 格式
       .setSourceUriList(sourceUriList) // 资源 uri 集合, Uri 格式
       .setMissPlaceHolder(R.mipmap.ic_empty_photo) // 资源加载前的占位图
       .setErrorPlaceHolder(R.mipmap.ic_empty_photo) // 资源加载错误后的占位图
       .setProgressIndicator(new ProgressPieIndicator()) // 资源加载进度指示器, 可以实现 IProgressIndicator 扩展
       .setIndexIndicator(new NumberIndexIndicator()) // 资源数量索引指示器,可以实现 IIndexIndicator 扩展
       .setImageLoader(GlideImageLoader.with(getApplicationContext())) // 图片加载器,可以实现 ImageLoader 扩展
       .setBackgroundColor(Color.parseColor("#000000")) // 背景色
       .setDuration(300) // 开启、关闭、手势拖拽关闭、显示、扩散消失等动画时长
       .setOffscreenPageLimit(2) // 第一次初始化或者切换页面时预加载资源的数量,与 justLoadHitImage 属性冲突,默认为 1
       .setCustomView(customView) // 自定义视图,将放在 transferee 的面板上
       .setNowThumbnailIndex(index) // 缩略图在图组中的索引
       .enableJustLoadHitPage(true) // 是否只加载当前显示在屏幕中的的资源,默认关闭
       .enableDragClose(true) // 是否开启下拉手势关闭,默认开启
       .enableDragHide(false) // 下拉拖拽关闭时,是否先隐藏页面上除主视图以外的其他视图,默认开启
       .enableDragPause(false) // 下拉拖拽关闭时,如果当前是视频,是否暂停播放,默认关闭
       .enableHideThumb(false) // 是否开启当 transferee 打开时,隐藏缩略图, 默认关闭
       .enableScrollingWithPageChange(false) // 是否启动列表随着页面的切换而滚动你的列表,默认关闭
       .setOnLongClickListener(new Transferee.OnTransfereeLongClickListener() { // 长按当前页面监听器
            @Override
            public void onLongClick(ImageView imageView, String imageUri, int pos) {
                saveImageFile(imageUri); // 使用 transferee.getFile(imageUri) 获取缓存文件保存,视频不支持
            }
        })
       .bindImageView(imageView, source) // 绑定一个 ImageView, 所有绑定方法只能调用一个
       .bindListView(listView, R.id.iv_thumb) // 绑定一个 ListView, 所有绑定方法只能调用一个
       .bindRecyclerView(recyclerView, R.id.iv_thumb)  // 绑定一个 RecyclerView, 所有绑定方法只能调用一个

step 3: 显示 transferee

transferee.apply(config).show();

step 4: 离开页面的时候需要销毁 transferee 中的资源,防止内存泄漏 (建议写在 onDestroy 方法中)

transferee.destroy()

Config

属性 说明
sourceUrlList 将要预览的资源 url 集合, String 格式
sourceUriList 将要预览的资源 uri 集合, Uri 格式
nowThumbnailIndex 缩略图在图组中的索引, 如果你绑定了 ListView 或者 RecyclerView,这个属性是必须的,否则可以忽略; 亦或可以作为打开 transferee 时指定初始化显示页面的 position
offscreenPageLimit 显示 transferee 时初始化加载的资源数量, 默认为1, 表示第一次加载3张(nowThumbnailIndex, nowThumbnailIndex + 1, nowThumbnailIndex - 1); 值为 2, 表示加载5张。依次类推
missPlaceHolder 缺省的占位图,资源 id 格式。资源未加载完成时默认显示的图片
missDrawable 缺省的占位图,Drawable 格式。资源未加载完成时默认显示的图片
errorPlaceHolder 加载错误的占位图,资源 id 格式。原图加载错误时显示的图片
errorDrawable 加载错误的占位图,Drawable 格式。原图加载错误时显示的图片
backgroundColor transferee 显示时,transferee 背景色
duration 开启、关闭、手势拖拽关闭、透明度动画显示、扩散消失等动画的时长
justLoadHitPage 是否只加载当前页面中的资源。如果设置为 true,那么只有当 transferee 切换到当前页面时,才会触发当前页面的加载动作,否则按 offscreenPageLimit 所设置的数值去做预加载和当前页面的加载动作,默认关闭
enableDragClose 是否支持向下拖拽关闭,默认开启
enableDragHide 拖拽关闭时是否隐藏除主视图以外的其他 view, 默认开启
enableDragPause 拖拽关闭时是否暂停当前页面视频播放, 默认关闭
enableHideThumb 是否开启当 transferee 打开时,隐藏缩略图,默认开启
enableScrollingWithPageChange 是否启动列表随着 page 的切换而滚动,仅仅针对绑定 RecyclerView/GridView/ListView 有效, 启动之后因为列表会实时滚动,缩略图 view 将不会出现为空的现象,从而保证关闭 transferee 时为过渡关闭动画, 默认关闭
progressIndicator 资源加载进度指示器 (默认内置 ProgressPieIndicator 和 ProgressBarIndicator)。可实现 IProgressIndicator 接口定义自己的资源加载进度指示器
indexIndicator 资源索引指示器 (默认内置 CircleIndexIndicator 和 NumberIndexIndicator)。可实现 IIndexIndicator 接口定义自己的资源索引指示器
imageLoader 资源加载器。可实现 ImageLoader 接口定义自己的图片加载器
imageId RecyclerView 或者 ListView 的 ItemView 中的 ImageView id
customView 用户自定义的视图,放置在 transferee 显示后的面板之上
listView 如果你是使用的 ListView 或者 GridView 来排列显示图片,那么需要将你的 ListView 或者 GridView 传入 bindListView() 方法中
recyclerView 如果你使用的 RecyclerView 来排列显示图片,需要将 RecyclerView 传入 bindRecyclerView() 方法中
imageView 如果只想对单个 ImageView 使用此库的功能,或者界面上单个的 ImageView 是相册的封面,那么使用 bindImageView(...) 或者它的重载方法可以满足你的需求

Method

方法 说明
getDefault(context) 获取 transferee 实例
apply(config) 将配置参数对象应用到 transferee 实例中
show() 打开/显示 transferee
show(listener) 打开/显示 transferee,并监听显示/关闭状态
isShown() transferee 是否显示
dismiss() 关闭 transferee
clear() 清除图片和视频等所有缓存文件
destroy() 销毁 transferee 使用到的资源, 防止内存泄漏
getImageFile(url) 获取与 url 对应的缓存图片
setOnTransfereeStateChangeListener(listener) 设置 transferee 显示/关闭状态改变的监听器

Update log

  • v1.6.1

    • 新增图片方向自动校正功能
    • 新增图片处理,优化大图的显示
    • ImageLoader 接口代码重构简化
    • State 代码重构,去除了无用代码,并删除了 RemoteThumbState
    • 修复部分机型上 stage 模式动画在阶段切换的时候抖动的 bug
    • 修复部分机型上状态栏和导航栏显示错误的问题
    • 修复打开和关闭的状态不能保持一致的 bug
    • 下滑手势优化
    • 重置不再当前显示区域的图片状态
    • 优化了内存占用,当浏览多图相册时,保证内存稳定
    • 解决了因为 Config 资源未回收而导致的内存泄漏问题
  • v1.6.0

    • 新增视频播放以及视频配套功能的支持
    • 新增 enableDragPause 属性控制视频拖拽关闭时是否暂停
    • 新增 enableHideThumb 属性控制缩略图是否消失
    • 新增 enableScrollingWithPageChange 属性控制用户的列表是否跟随 transferee 页面切换而滚动
    • 优化下拉关闭手势的交互
    • 优化页面切换时,性能较差手机上可能出现一次闪屏的问题
    • 优化在没有网络的情况下,transferee 启动或者关闭时一些边界性质的问题
    • 优化图片没有加载出来的时候,手势关闭的时候动画不正常的问题
    • 修复因为无法获取 originImage 导致的占位图为空的 bug
    • 修复加载失败的时候,无法通过点击屏幕关闭的 bug
    • 修复关闭时,背景色渐变算法错误的 bug
    • 修复使用修复 bindImageView api 出现数组下标越界的 bug
    • 修复当动画时长较长时,出现的没有打开完成之前,就能使用物理按键关闭的 bug
    • 修复部分机型上只加载缩略图,没有加载高清图,打开后,占位图大小不一样的 bug
    • 修复了全面屏、刘海屏 dialog 全屏适配错误的 bug
    • 修复部分机型上 enableDragHide 功能不正常的 bug
    • 修复弱网或者无网的情况下,被隐藏的页面占位图不显示的 bug
    • 修复了一些代码逻辑错误
  • v1.5.2

    • 修改 transferee 容器 dialog 固定为全屏样式。更好的配合当前可定制化的状态栏。
    • transferee 绑定的 ListView 或者 RecyclerView 支持添加 header 或者 footer
    • RecyclerViewActivity 新增线性排列和九宫格排列切换,演示在不同的列表下 transferee 使用方式
  • v1.5.1

    • 修改在无网络的时候,使用 GlideImageLoader 加载图片闪退和行为错乱的问题
    • 添加 enableDragHide 属性,控制在拖拽关闭的时候,是否立即隐藏其他 view
    • 由于历史原因,不再兼容4.4以下的全屏模式。同时修复了 StatusBar 抖动的问题
    • 拓展 Uri 格式的图片数据源接口
    • 添加不绑定 view 也能使用 Transferee 的状态模型
    • 同步更新 demo
  • v1.5.0

    • 新增拖拽关闭功能
    • 新增 gif 图片和大长图显示
    • 添加图片源文件保存功能
    • 添加 GlideImageLoader 作为图片加载的扩展项
    • 添加 PicassoLoader 作为加载图片的扩展项
    • 新增自定义显示面板 ui 的接口,可以让用户自己添加 view 到显示面板上
    • 兼容 AndroidX
    • 修复长图显示模糊的问题
    • 修复因为网络错误或者图片地址问题而导致图片加载失败后,进度条没有关闭的bug
    • 兼容图片比ImageView多的情况 「fix bug#70」
    • 化调用方式,不需要关注缩略图片是否加载完成
    • 修复缓存清除的crash
  • v1.3.0

    • 支持 transferee 绑定单个 ImageView 直接使用
    • 支持 transferee 绑定单个 ImageView 后多样化展示图片,兼容有缩略图,无缩略图,或者实际图片数量远大于这里的一个 ImageView 数量,例如点击相册封面图片,可以查看相册中其他的图片的的功能
    • 优化 api 使用方式,最简可以只需要绑定控件,传入图片地址后就能使用
    • 优化用户体验,不再需要关注缩略图是否加载完成,任何时刻都可以立即打开 transferee
    • 修复内存泄漏问题
    • 简化 demo 代码
  • v1.2.0

    • 针对之前版本的使用复杂考虑,添加了直接绑定 ListView,GridView,RecyclerView 即可使用,不再需要人肉传入 originImageList
    • 修复有超出屏幕外图片情境下 transferee 崩溃的情景
    • 修复 Issues 中各位同学反馈的bug
  • v1.1.0

    • 修复 transferee 单例为普通实例,解决多个界面公用 transferee 单例时的异常问题
  • v1.0.0

    • 将项目托管到 jitpack。目前可以使用添加 dependencies 的方式,导入 transferee 组件
  • v0.5

    • 优化打开或者关闭 transferee 时背景色显示效果,从直接显示背景色优化为渐变显示。
    • 基于 #26 添加 transferee 使用本地图片场景下的 Demo
    • 为 transferee 组件添加背景色自定义功能
    • 为 transferee 组件添加长按监听器,并添加了长按保存图片到相册的示例代码
    • 更新了部分示例代码中失效的图片地址

Licence

Copyright 2017 Vans, Inc.

Licensed 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.0

Unless required by applicable law or agreed to in writing, software
distributed 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 and
limitations under the License.

transferee's People

Contributors

hitomis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

transferee's Issues

关于在“Glide测试(无缩略图)”页面中从viewpager退出来以后列表图片仍然显示占位图的BUG

操作步骤如下:
1,打开 Glide测试(无缩略图) 界面
2,9张图片全部显示占位图,表示正在加载状态,这时候直接点击其中的某一张图片,跳转到viewpager界面,progreesspie也显示出来,表示正在加载图片,等到加载完图片,图片在viewpager中完全显示,这时候立马摁返回键,回到列表界面,发现列表中刚刚点击的那张图片还是处于占位图的状态。
我期望出现的现象:
在dialog中已经加载图片完毕了,摁返回键退出viewpager界面,这时候列表中刚刚点击的那张图片应该显示图片,因为我刚才在viewpager里面加载完了。

另外,你这个库真的很棒!!!!支持作者!!!!

怎么设置就打开一张

.setSourceImageList(imagesList.map { it.url })
.setOriginImageList(imageViewList)

俩集合size为1,我看了源码,你有针对传入角标和当前集合size比较,抛出:
the parameter nowThumbnailIndex will generate an IndexOutOfBoundsException error 异常

GridView无法实现GroupImageActivity效果

像微信那样,点击九宫格GridView Item进入预览,在预览Activity应该也是Viewpager左右滑动的,现在demo给出的GridView 预览只能预览当前一个图片,所以尝试把代码改成GroupImageActivity的方式,发现在预览图片界面会发生空指针异常,containnerLayoutMap的size远远小于传入的ImageViewList的size,不知道containnerLayoutMap的加入数据逻辑是否有问题,并且GridView 传入的一组ImageViewList 还要手动写循环构造一个List才能匹配setOriginImages参数

蓝瘦

最近优化一下项目的一些ui,刚好有这么个动画需求,在网上找了一圈没发现合适的,自己造了个轮子,这几天才发现了这个项目。。 心好累
大概过了一下你的库,扩展性和代码都不错,nb,不过有两个建议:
1.看 qq 或者 微信,一旦原图加载完毕第二次打开的时候应该就直接是原图了,就不该还能看见缩略图了。
2.最好对 view 做一个缓存,添加到 contentView 的那个 view 可以做成 activity 级别的单例,当 activity 销毁的时候再移除?
我说的有误或者你有其他见解可以指出 ,嘻嘻

不错,,但有个小八哥

首先感谢分享 效果很好 类似5.0的转场动画,,不过发现了个小bug ,多加入几张图片让GridView 可以滑动的时候 `点击会包空指针

`05-12 11:26:22.761 19532-19532/com.hitomi.transferimage E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.hitomi.transferimage.activity.BaseActivity.wrapOriginImageViewList(BaseActivity.java:45)``

不能定制吗?

有可能不需要引指器,增加显示标题、保存图片到本地、识别二维码等功能。TransferLayout最好公开。
用转场动画可能更好,虽然在5.0以下没兼容。
只看了一点代码,可能说的有错

图片超过一屏报错

GridView 中的图片超过一屏 后点击图片报错
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.LinearLayout.getChildAt(int)' on a null object reference at com.hitomi.transferimage.activity.BaseActivity.wrapOriginImageViewList(BaseActivity.java:50)

当原始的 ImageView 设置的图片为ColorDrawable或者矩形shape,加载大图时占位图显示不正确

原始图片加载方式,placeholder使用ColorDrawable

   Glide
                    .with(context)
                    .load(url)
                    .placeholder(new ColorDrawable(Color.parseColor("#f9f9f9")))
                    .into(imageView);

或者placeholder使用的是如下的shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#fff9f9f9"/>
</shape>

效果如下

显示的时候,报 java.lang.NullPointerException 了

// 在个在 onCreate 执行
transferee = Transferee.getDefault(this);

// 这个在点击图片的时候执行
TransferConfig  config = TransferConfig.build()
                .setSourceImageList( getImages() )
                .setMissPlaceHolder(R.mipmap.ic_launcher)
                .setErrorPlaceHolder(R.mipmap.ic_launcher_round)
                .setProgressIndicator(new ProgressBarIndicator())
                .setIndexIndicator(new NumberIndexIndicator())
                .setJustLoadHitImage(true)
                .setImageLoader(GlideImageLoader.with( getApplicationContext() ))
                .create();
        transferee.apply(config).show();

然后就报错了,错误:

07-02 12:38:13.170 29880-29880/com.example.puppy.test E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.example.puppy.test, PID: 29880
                                                                        java.lang.NullPointerException
                                                                            at com.hitomi.tilibrary.transfer.Transferee.checkConfig(Transferee.java:104)
                                                                            at com.hitomi.tilibrary.transfer.Transferee.apply(Transferee.java:135)
                                                                            at com.example.puppy.test.MainActivity.viewImage(MainActivity.java:146)
                                                                            at com.example.puppy.test.MainActivity.onNavigationItemSelected(MainActivity.java:120)
                                                                            at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
                                                                            at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:821)
                                                                            at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
                                                                            at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:968)
                                                                            at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
                                                                            at android.view.View.performClick(View.java:4446)
                                                                            at android.view.View$PerformClick.run(View.java:18480)
                                                                            at android.os.Handler.handleCallback(Handler.java:733)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                            at android.os.Looper.loop(Looper.java:136)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5314)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:515)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
                                                                            at dalvik.system.NativeStart.main(Native Method)

用recycleview复用的时候,里面的imgaview集合加的是上一个imagview

复用的时候,会把上一个imageview加进去,然后点击会再上一个imageview的地方放到到全屏,目前解决方法是:
private SparseArray<List> imgs = new SparseArray<>();

public List getOriginImgList(int position) {
return imgs.get(position);
}
在onBindViewHolder的时候每个position都加一个imageview的集合,把你需要显示的imageview都加进去

使用tranferee过程中的疑问.

项目已经使用Glide , 下面是配置的参数:

       TransferConfig config = TransferConfig.build()
                .setNowThumbnailIndex(position)
                .setSourceImageList(sourceImageList)
                .setOriginImageList(originImageList)
                .setProgressIndicator(new ProgressBarIndicator())
                .setIndexIndicator(new NumberIndexIndicator())
                .setJustLoadHitImage(true)
                .setImageLoader(TranGlideImageLoader.with(context))
                .create();

        // 实现
        mTransferee.apply(PhotoPicker.getPreViewConfig(position, mGridCommodity.getData(), getItemView(grid_commodity))).show(new Transferee.OnTransfereeStateChangeListener() {
                    @Override
                    public void onShow() {
                        Glide.with(ShopCSActivity.this).pauseRequests();
                    }

                    @Override
                    public void onDismiss() {
                        Glide.with(ShopCSActivity.this).resumeRequests();
                    }
                });

疑问:
我这边有2种使用场景, 一种是本地, 一种是网络图片 ....
现在传递的List是一组本地的图片, 奈何进入后一直在转圈 (按道理glide是识别的)
然后就是, 我不明白你这个所谓的内置GlideImageLoader 和 UniversalImageLoader 我默认是没导入进来这个 model, 采用的是自己的ImageLoader: TranGlideImageLoader

public class TranGlideImageLoader implements ImageLoader {
    private static final String SP_FILE = "transferee";
    private static final String SP_LOAD_SET = "load_set";

    private Context context;
    private SharedPreferences loadSharedPref;

    private TranGlideImageLoader(Context context) {
        this.context = context;
        loadSharedPref = context.getSharedPreferences(
                SP_FILE, Context.MODE_PRIVATE);
    }

    public static TranGlideImageLoader with(Context context) {
        return new TranGlideImageLoader(context);
    }

    @Override
    public void showSourceImage(final String srcUrl, ImageView imageView, Drawable placeholder, final SourceCallback sourceCallback) {
        Glide.with(context)
                .load(srcUrl)
                .dontAnimate()
                .placeholder(placeholder)
                .into(imageView);
    }

    @Override
    public void loadThumbnailAsync(String thumbUrl, ImageView imageView, final ThumbnailCallback callback) {
        Glide.with(context)
                .load(thumbUrl)
                .dontAnimate()
                .into(imageView);
    }

    @Override
    public boolean isLoaded(String url) {
        Set<String> loadedSet = loadSharedPref.getStringSet(SP_LOAD_SET, new HashSet<String>());
        return loadedSet.contains(url);
    }

    @Override
    public void clearCache() {
        loadSharedPref.edit()
                .remove(SP_LOAD_SET)
                .apply();

        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                Glide.get(context).clearDiskCache();
                Glide.get(context).clearMemory();
            }
        });
    }

    /**
     * 使用 BannerImageLoader 时,需要缓存已加载完成的图片Url
     *
     * @param url 加载完成的图片Url
     */
    public void cacheLoadedImageUrl(final String url) {
        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                Set<String> loadedSet = loadSharedPref.getStringSet(SP_LOAD_SET, new HashSet<String>());
                if (!loadedSet.contains(url)) {
                    loadedSet.add(url);

                    loadSharedPref.edit()
                            .clear() // SharedPreferences 关于 putStringSet 的 bug 修复方案
                            .putStringSet(SP_LOAD_SET, loadedSet)
                            .apply();
                }
            }
        });
    }
}

查看图片返回的时候dialog消失后屏幕闪一下

   建议在调用Activity的oncreate中加入或者BaseActivity
    /**
     * 全屏不重绘
     */
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

在Fragment中使用预览图片退出时有弹跳感

你的demo中没有,
如果给fragment的宿主activity设置了flag则没有问题:
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
但是,设置了在api4.4+就铺满屏幕了,不要铺满啊

大量图片滚动crash

里面有一个wrapOriginImageViewList,用来保存ImageView,如果有大量的Item呢,直接会Crash,能不能改成可见ImageView有动画,其他不可见的直接加载到ViewPager

多 activity 同时使用时冲突

我目前有一个情况就是, 我在 MainActivity 需要使用到 transferee, 然后在 MainActivity 会打开 SecondActivity , 而我在 SecondActivity 也会使用到 transferee , 当我从 SecondActivity 返回 MainActivity 时, 因为 我在 SecondActivity 已经把 transferee destory 了, 所以当我再使用 transferee 时,就报错了
请问这个怎么解决?

无限循环

无限循环,把viewPager做成无限循环

在Fragment和Activity中一起使用会报错

我在Fragment中onCreat()中初始化,单独使用没问题,然后在BaseActivity中初始化,然后在别的Activity中使用时,第一次正常显示,然后在去Fragment中点击图片,没什么问题,然后在回到这个Activity中点击图片 ,点击图片不显示大图,按下返回键就显示大图。但是Activity已经onDestory了,大图仍然显示,在按下返回键程序就崩了。

哥们,你做的很不错

虽然还是有点小缺憾,但是做的确实很不错了,干货没推荐你是他们的损失,也是我们的损失

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.