四步通过Glide实现共享元素无缝转场效果

linux离线安装nginx 阅读详情

读完这篇文章, 你就会知道使用Glide等图片加载库实现共享元素转场效果,以及如何处理各种可能加载状态。通过共享转场动画,可以提升应用交互体验,让用户使用起来更愉悦。
共享元素转场效果是Material Design的一个重要的转场效果. 如果图片资源是静态本地的,那么实现起来是容易的。但是通过网络下载图片并且创建一个无缝的动画效果就比较棘手了。

开始之前

此篇文章是在开发Toast App时,对于转场效果的一个总结. 该app是TOAST – Android 开发者聚会(波兰最大的Android开发者聚会网站)的客户端app. app中包含了每个TOAST事件,定期讲座和活动照片。 我们主要用共享元素转场作为页面切换效果。同时使用Glide来获取所有的图片。
本文中介绍的方法也应适用于其他图像加载库,例如Picasso 或者 Fresco (您需要找到Glide特定功能的相对应的代码实现). 为此我制作了一个示例演示程序, 发布在Github上. 所有代码段均来自此示例程序。
我们使用一组网格图片作为开始. 当用户点击一张图片, 会打开一个新的Activity,图片会裁剪并填充整个屏幕。下面是使用Glide加载图片的相关代码:

fun ImageView.load(url: String) {
    Glide.with(this)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200720201256425.jpg#pic_center)

            .load(url)![在这里插入图片描述](https://user-gold-cdn.xitu.io/2020/7/19/1736612e3968fc66?imageslim#pic_center)

            .apply(RequestOptions.placeholderOf(R.drawable.placeholder))
            .into(this)
}

第一步: 共享过渡

我们可以通过添加正确options来创建过渡效果,修改 goToDetails 方法如下:

MainActivity.kt
fun goToDetails(url: String, imageView: View) {
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, imageView.transitionName).toBundle()
    Intent(this, DetailActivity::class.java)
            .putExtra(IMAGE_URL_KEY, url)
            .let {
                startActivity(it, options)
            }
}

现在, 我们在上面的方法中传入要共享的view,并设置transitionName。这个名称在每个activity中必须是唯一的,主视图和详情页面相对应的view的transitionName则要相同,在此为了简化,我们使用图片url作为transitionName:
DetailActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_detail)
    val url = intent.getStringExtra(IMAGE_URL_KEY)
    detailImage.transitionName = url
    detailImage.load(url)
}
ImageAdapter.kt
inner class ImageViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    fun bind(url: String) {
        (itemView as ImageView).apply {
            load(url)
            transitionName = url
            setOnClickListener { onClick(url, it) }
        }
    }
}

但是这并不是我们想要的效果🙁

第二步: 推迟过渡效果

Glide需要时间将图片加载到ImageView. 这就是为什么在onCreate中 我们不得不推迟过过渡动画效果,直到图片下载完成才可以开始进行过渡效果:
DetailActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    supportPostponeEnterTransition()
    detailImage.load(url) {
        supportStartPostponedEnterTransition()
    }
}
GlideLoader.kt
fun ImageView.load(url: String, onLoadingFinished: () -> Unit = {}) {
    val listener = object : RequestListener<Drawable> {
        override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
            onLoadingFinished()
            return false
        }

        override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
            onLoadingFinished()
            return false
        }
    }
    Glide.with(this)
            .load(url)
            .apply(RequestOptions.placeholderOf(R.drawable.placeholder))
            .listener(listener)
            .into(this)
}

现在我们在过渡前图片已经加载了,但可以看到的是在进入过渡之前以及退出过渡之后会有奇怪的毛刺,我们将在下一步处理它。

第三步: 禁止转换

之所以有这个毛刺效果是由于Glide在加载时进行的优化。 默认的, Glide为了匹配目标view会调整图片大小并裁剪图片。但是Android过渡框架在过渡开始时会从目标视图获取图像,并且将它转换到源视图的图像。我们可以让Glide不进行这些优化:
GlideLoader.kt

fun ImageView.load(url: String, onLoadingFinished: () -> Unit = {}) {
    ...
    val requestOptions = RequestOptions.placeholderOf(R.drawable.placeholder)
            .dontTransform()
    Glide.with(this)
            .load(url)
            .apply(requestOptions)
            .listener(listener)
            .into(this)
}

我们也可以在Glide中使用原始图片大小。这会减少过渡延迟,因为原始图片会存在于内存中,不会在磁盘缓存中。注意:此操作会让你的的程序变慢,需要小心使用。
现在可以正常使用了,但在一些错误链接图片获取未加载完成但图片就会有一个小问题。

第四步: 仅在Cache时传输

我们要在任何条件下都可以无缝过渡,最简单的方式是从缓存中获取图片 (或者如果图片未加载完成时, 就使用占位图)。
DetailActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    detailImage.load(url, loadOnlyFromCache = true) {
        supportStartPostponedEnterTransition()
    }
}
GlideLoader.kt
fun ImageView.load(url: String, loadOnlyFromCache: Boolean = false, onLoadingFinished: () -> Unit = {}) {
    ...
    val requestOptions = RequestOptions.placeholderOf(R.drawable.placeholder)
            .dontTransform()
            .onlyRetrieveFromCache(loadOnlyFromCache)
    ...
}

当然,这意味着用户打开详情页面时,在图片加载完成之前,只会显示占位图。它会在过渡结束后通过第二次请求来修复:
DetailActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    window.sharedElementEnterTransition = TransitionSet()
            .addTransition(ChangeImageTransform())
            .addTransition(ChangeBounds())
            .apply {
                doOnEnd { detailImage.load(url) }
            }
}	

最终,我们有了一个非常棒的过渡转场效果,它可以工作在各种条件下。
相关链接
Workcation App – Part 4. Shared Element Transition with RecyclerView and Scenes
Meaningful Motion with Shared Element Transition and Circular Reveal Animation
Workcation App – Part 1. Fragment custom transition
How to Learn Android Development Programming – 6 Steps for Beginners
6 Misconceptions about TDD – Part 4. There is one right granularity of steps
Android资料免费领取:https://shimo.im/docs/TG8PDh9D96WGTT8W

微信小程序 - 最新详细实现用户保存下载视频到手机相册,将视频临时路径、在线播放地址(网络路径)URL存储到手机,弹出访问手机相册权限询问,支持视频格式mp4、avi、mov、wmv、flv、webm 微信小程序,视频,手机相册,保存,另存为,小程序保存到相册权限,writePhotosAlbum,一键保存视频到手机相册功能(视频来源为链接),第一次要获取用户授权,授权使用相册权限,小程序视频下载,如何把视频下载到相册,下载一个视频到本地相册,显示下载进度,可取消下载,视频下载到本地,微信小程序视频如何下载,保存视频到相机,页面播放视频并下载到本地,安卓系统,苹果ios保存到相册报错,权限拒绝后打不开,添加相册授权弹框拒绝后再也出不来了,实现保存视频到手机相册功能,将mp4在线视频下载并存储到用户的手机中 阅读详情

相关推荐

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3181

图片加载7:Glide4基本使用

(1)添加依赖 Glide最新版本已经更新到4.9了。 implementation 'com.github.bumptech.glide:glide:4.9.0' (2)权限 加载网络需要用到网络权限: <uses-permission android:name="android.permission.INTERNET"/> (3)解决Android8.0以上手机...

qijingwang的博客 657

死磕GMSSL通信-java/Netty系列(二)

Netty-tcnative再linux编译比较好编译,但是再window编译,我尝试了各种办法,总是编译失败,所以我采用半自动的方式进行编译,Netty-tcnative会生成临时文件,直接用vs打开,设置openssl的头文件和静态库路径,然后生成静态库,静态库改个名字放到jar包里边,其实自动编译也是这个原理哈哈O(∩_∩)O。直接传输五个证书的路径吗,之前有的是说要转成x509之类的,转来转去的有点麻烦,这个是直接传输证书路径,由底层gmssl去解析,格式必须是pem格式。然而,若项目已依赖于。

qq_36577699的博客 3025

Glide 使用Transformation 时保持 placeholder、error统一的一种方式

有时候我们碰到某个需求,有一个默认的error图片,大部分地方都用这个图片。但是有的地方我们用圆角,有的地方我们用圆形,如果用Glide的transform变换的话,error将不会跟随实际的图片变换,但是我们又不想不同的地方取更换图片,或者直接把ImageView弄成CircleImageView之类的,这里提供一种跟随实际图片转换的方法。比如上图的图片,我们要全局应用,适配圆角和圆形变换。调用的时候,注意必须在写的扩展方法的作用域调用。这样就保证error和实际图片都可以应用转换。

JabamiYu的博客 904

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 247

Day470&471.Netty概述&Netty高性能架构设计 -netty

Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO

阿昌爱Java 1571

Glide源码阅读之原型模式【TransitionOptions】【BaseRequestOptions】【RequestBuilder】

Glide源码解读:原型模式笔者碰到的环境几乎不怎么使用。估计是没有理解原型模式的内涵。不过这篇解析写完也就掌握的七七八八了。它的使用场景还是蛮鲜明的,关注我。让设计模式成为你编程的阻力变成助力。

产品:SmartApi;服务:大前端++;其他技术分享 1338

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6787

Glide4.0 Transformation大全,罗列搜集所有Transformation,实现图片的变换

在使用Glide4.X的时候,经常会使用到图片变换的情况,都是网上搜索一番,`Ctrl + C` + `Ctrl + V`,没有系统地去看过这一块东西,网上的资料也很零散,有时候遇到一些较复杂的情况,得搜索好久才能得到自己想要的结果。出现这个痛点后,现准备针对Transformation罗列记录一下........................

朱豪凯的博客 2435

Python-自动化绘制股票价格通道线

创建更强大、更可靠的价格通道检测算法。

探索人工智能领域 948

[QMT和ptrade量化交易小白入门]-122、基于聚类分析的动态股票池构建与ETF轮动策略,回测年化 132.09%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1024

【Android】Glide的简单使用(上)

Glide是Google员工的开源项目,Google官方App中已经使用,在2015年的Google I/O上被推荐。Glide的优点: 使用简单,可配置度高,自适应程度高,支持多种数据源,网络、本地、资源、`Assets`等,支持`Gif`图片。

xoliu的博客 1748

精密加工零件自动报价智能体设计与实现

摘要 本文设计并实现了一个精密加工零件自动报价智能体系统。该系统通过计算机视觉和几何分析技术,自动读取3D图纸(STEP/STL格式),提取影响加工成本的几何特征,实现精准报价。系统采用模块化设计,包含3D模型解析、特征提取、成本计算和报价生成四个核心模块。关键技术包括:使用PythonOCC处理STEP文件,Trimesh处理STL网格;实现体积、表面积、包围盒等基础几何量计算;开发特征提取算法识别复杂曲面、深孔等加工难点;基于规则库进行可加工性评分和成本估算。相比传统人工报价方式,该系统能显著提高报价效

AI的内部世界的博客 111

android glide加载不出图片_Glide实现共享元素无缝转场效果,只需四步!

原文:How to Use Shared Element Transition with Glide in 4 steps作者:Bartłomiej Osmałek读完这篇文章, 你就会知道使用Glide等图片加载库实现共享元素转场效果,以及如何处理各种可能加载状态。通过共享转场动画,可以提升应用交互体验,让用户使用起来更愉悦共享元素转场效果是Material Design的一个重要的...

weixin_39670464的博客 504

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 转场动画 共享元素,关于android:四步通过Glide实现共享元素无缝转场效果...

读完这篇文章, 你就会晓得应用Glide等图片加载库实现共享元素转场成果,以及如何解决各种可能加载状态。通过共享转场动画,能够晋升利用交互体验,让用户应用起来更愉悦。 共享元素转场成果是Material Design的一个重要的转场成果. 如果图片资源是动态本地的,那么实现起来是容易的。然而通过网络下载图片并且创立一个无缝的动画成果就比拟辣手了。开始之前此篇文章是在开发Toast App时,对于转...

weixin_34226837的博客 500

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Glide框架 结合glide-transformations使用或者自己重写Transformation使用

1 //gidle compile ‘com.github.bumptech.glide:glide:3.7.0’//glide-transformation(3.0.1的有点大的改变 不过我还是喜欢用2.0.1的本版 有需要的同学 可以自己去看一下(https://github.com/wasabeef/glide-transformations) compile ‘jp.wa

LDH_123的博客 3174

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Glide中的Transition动画:实现平滑的图片切换效果

在Android应用开发中,图片加载不仅要高效,还需要有良好的用户体验。Glide作为专注于平滑滚动的图片加载库,其Transition动画功能可以让图片切换更加自然流畅。本文将详细介绍如何在Glide中使用Transition动画,从基础概念到实际应用,帮助开发者轻松实现专业级的图片过渡效果。 ## Transition动画基础 Transition动画是Glide提供的一种机制,用于在图片...

gitblog_00531的博客 510

Android Glide使用详解

Glide 是一个快速高效的 Android 开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一个简单易用的界面中。 Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。 Glide的Api十分灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

帅次的博客 1万+

Glide v4详解

简介 下载 配置 使用 简单使用 高级用法 RequestOptions TransitionOptions Generated API RequestBuilder Configuration 使用技巧 Glide的图片变换Transformations Glide的过渡动画Transitions Glide的缓存管理Caching 简介 Glide项目于2012年12

商明超的专栏 1万+

玩转Glide 4.x之Transformation变换

写在开头 公司老项目决定从ImageLoader替换为当前流行框架Glide,准备单独开发成图片组件,目前正在学习中,总结一波,希望能和大家共同进步,也希望大家提供更好的封装及思路共同完善这个组件,方便你我的使用。 图片组件地址:https://github.com/loveAndroidAndroid/GlideMoudle(包含图片变换,进度监听,图片(gif)加载等等,还希望大家能一起补充)...

weixin_33698043的博客 758

Czkawka终极文件清理解决方案:多平台、高性能的重复文件查找与磁盘管理工具

Czkawka(发音:tch•kav•ka,波兰语意为"打嗝")是一款功能强大的多平台文件清理工具,专注于查找重复文件、空文件夹、相似图片、相似视频等磁盘管理任务。作为一个完全免费、开源且无广告的工具,Czkawka采用Rust语言编写,提供卓越的性能和内存安全性,是技术爱好者和中级用户进行磁盘清理和文件管理的专业选择。 [![Krokiet图形界面](https://raw.gitcode.c

gitblog_00246的博客 712

Android 开发 框架系列 glide-transformations 图片处理基本使用

首先简单的介绍一下Gilde作用范围。Gilde功能十分强大,它可以实现图片处理、图片本地加载、图片网络加载、位图加载、图片内存缓存、图片磁盘缓存、Gif图片加载。使用简单轻松,轻松的后是它强大的心,它帮你解决了http、输入输出流、图片缓存管理、批量加载线程管理、图片处理。 另外,因为Gilde更新了很多年了,所以部分之前的使用方式已经被作者修改,所以本人重新整理了一些基本使用: ...

cherish152的博客 212

Glide4.0 加载图 未遮盖 占位图 DrawableTransitionOptions.withCrossFade(300)

现象:加载图未把占位图遮挡,会看到占位图。 原因:使用Glide实现渐入动画效果采用requestBuilder.transition(DrawableTransitionOptions.withCrossFade(300)) 解决: DrawableCrossFadeFactory drawableCrossFadeFactory = new DrawableCrossFadeFac...

4130

Glide的基本使用及简单源码分析

1、概述 Glide可以说是目前最常用的Android图片加载框架,类似的框架还有Picasso、Fresco和UniversalImageLoader等。另外volley也是有图片加载的功能的,只是volley太久没用,都忘记了。这些框架里,最推荐使用的就是Glide,因为它使用的人最多、依旧在不断地更新维护且不需要使用框架定制的View。 那么Glide有哪些能力呢?且看: 占位符:在加载目标图片成功之前,先展示一个默认的图片而不是一片空白,提升用户体验 图片变换:在加载图片成功后,可以先对图片进行某

1279

Android 玩转Glide4---进阶篇

前言 系列文章专栏: 玩转Glide4 基础使用篇:Android 玩转Glide4—基础使用篇 概述 基础使用篇中我们简单介绍了Glide4的使用,以及相对于Glide3的变化。 本篇进阶篇,将会介绍预加载,生命周期,加载监听,下载图片等方面的内容。 预加载—preload() Glide加载图片会自动判断图片是否在缓存中,以此来决定直接读取缓存还是直接下载。 但是如果我希望提前对图片进行一个预...

DeMonnnnnn 5404

Android中Glide的使用

第1章 Glide的使用 1.1 Glide的概述 Glide,就像 Picasso,可以从多个源去加载和显示图片,同时也兼顾缓存和在做图片处理的时候维持一个低内存消耗。它已经在 Google 官方 APP (如 Google 2015开发者大会的应用程序)中使用了,就和 Picasso 一样受欢迎。 1.2 Glide的引入 1.2.1 Glide的配置 在AndroidMainFest.xml中添加以下代码: dependencies { implementation 'com

晨曦的博客 8629
上一篇: Flutter 自定义单选控件
下一篇: Android 自定义View Canvas绘制几何图形基础
Android_008
博客等级 码龄6年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值