Android 4.4.2引入的超炫动画库

2023-11-18

酷炫!


作者博客

http://rkhcy.github.io/

源码地址

https://github.com/Rkhcy/TransitionNote

Google Demo

https://github.com/android/platform_frameworks_support

目录

  • 概述

  • Scene

  • Transition

  • TransitionManager

  • 常用API

    • 1.4.1. AutoTransition

    • 1.4.2. ChangeBounds

    • 1.4.3. ChangeClipBounds

    • 1.4.4. ChangeImageTransform

    • 1.4.5. ChangeScroll

    • 1.4.6. ChangeTransform

    • 1.4.7. Explode

    • 1.4.8. Fade

    • 1.4.9. Slide

    • 1.4.10. TransitionSet

    • 1.4.11. PathMotion

    • 1.4.12. 自定义Transition

  • Note


0

概述

Android 4.4.2 (API level 19)引入Transition框架,之后很多APP上都使用该框架做出很酷炫的效果,如 Google Play Newsstand app


还有github上很火的plaid

https://github.com/nickbutcher/plaid

在app中适当得使用上Transition能带来较好的用户体验,视频中介绍了该框架的基本使用以及其中核心的一些类和方法,只有学会这些基本的API才能在之后的Activity/Fragment过渡定制一些自己想要的效果。


先看官网的一张关系图

图中有三个核心的类,分别是Scene、Transition和TransitionManager,下面对这个三个核心类展开分析。


1

Scene

Scene场景,用于保存布局中所有View的属性值,创建Scene的方式可以通过getSceneForLayout方法


getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)


比如:

也可以直接new Scene(ViewGroup sceneRoot, View layout)

两种方式都需要传SceneRoot,即该场景的根节点。


2

Transition

Transition过渡动画,前面创建了两个场景,分别保存了视图的一些属性,比如Visibility、position等,Transition就是对于这些属性值的改变定义过渡的效果。从上图可以看到系统内置了一些常用的Transition,Transition的创建可以通过加载xml,如:


res/transition/fade_transition.xml

然后在代码中:

或者直接在代码中:


3

TransitionManager

TransitionManeger用于将Scene和Transition联系起来,它提供了一系列的方法如setTransition(Scene fromScene, Scene toScene, Transition transition)指明起始场景和结束场景、他们的过渡动画是什么,go(Scene scene, Transition transition),到指定的场景所使用的过渡动画是什么,beginDelayedTransition(ViewGroup sceneRoot, Transition transition),在当前场景到下一帧的过渡效果是什么。比如这里使用go()方法,效果:

注意这里两个Scene中红绿两个方块除了位置和大小不一样,id是一致的,transition记录下两个Scene前后属性值,根据属性值的改变执行过渡动画,默认情况下对SceneRoot下的所有View执行动画效果,我们可以通过Transition.addTarget和removeTarget方法选择性添加或移除执行动画的View。


4

常用API

有时候我们只想改变当前已展示的视图层级中View的状态,可以通过beginDelayedTransition实现,下面列举系统内置的Transition的使用。


AutoTransition

AutoTransition默认的动画效果,对应xml tag为autoTransition


其实是以下几个动画组合顺序执行:

在代码中使用:


ChangeBounds

ChangeBounds对应xml tag为changeBounds,根据前后布局界限的变化执行动画。


ChangeClipBounds

ChangeClipBounds对应xml tag为changeClipBounds,作用对象:View的getClipBounds()值


ChangeImageTransform

对应xml tag为changeImageTransform,作用对象:ImageView的matrix


ChangeScroll

对应xml tag为changeScroll,作用对象:View的scroll属性值


ChangeTransform

对应xml tag 为changeTransform,作用对象:View的scale和rotation


Explode

对应xml tag为explode,作用对象:View的Visibility


Fade

对应xml tag为fade,作用对象:View的Visibility


可以在初始化是指定IN或者OUT分别对应淡入和淡出,若不指定默认为淡入淡出效果


Slide

对应xml tag为slide,作用对象:View的Visibility


TransitionSet

对应xml tag为transitionSet


可以在代码中创建transitionSet如:

也可以通过加载xml布局创建transitionSet:

xml布局长这样:

通过transitionOrdering属性设置动画执行的顺序,together表示同时执行,sequential表示顺序执行,在代码中可以调用TransitionSet的setOrdering(int)方法,属性值传ORDERING_SEQUENTIAL或者ORDERING_TOGETHER


在代码中:

这里结合changeImageTransform和changeTransform,效果如下:


PathMotion

Transition的辅助工具,以path的方式指定过渡效果,两个具体实现类ArcMotion和PatternPathMotion,看下ArcMotion的效果

它的运动轨迹是条曲线,有兴趣的可以研究下它的实现算法,在源码中有个很萌的图如下:


自定义Transition

除了系统内置的Transition,我们还可以自定义Transition效果,需要继承Transition

其工作原理是在captureStartValues和captureEndValues中分别记录View的属性值,官网建议确保属性值不冲突,属性值的命名格式参考:

package_name:transition_name:property_name


在createAnimator中创建动画,对比属性值的改变执行动画效果,如自定义修改颜色动画效果:

在两个Scene中使用自定义过渡动画,效果如下:


5

Note

  1. Android 版本在4.0(API Level 14)到4.4.2(API Level 19)使用Android Support Library’s


  2. 对于 SurfaceView可能不起效果,因为SurfaceView的实例是在非UI线程更新的,因此会造成和其他视图动画不同步。


  3. 某些特定的转换类型在应用到TextureView时可能不会产生所需的动画效果。


  4. 继承自AdapterView的如ListView,与该框架不兼容。


  5. 不要对包含文本的视图的大小进行动画

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 4.4.2引入的超炫动画库 的相关文章

  • 如何制作像 Google+ 应用程序中那样的气泡? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道如何使用 Google An
  • 通过代码在创建时突出显示 ListView 项目

    我想在创建 listView 时突出显示 ListView 的第一行 0 我尝试了不同的方法 就像您在注释代码中看到的那样 但没有任何效果 这很奇怪 因为 OnItemClickListener 中的突出显示工作正常 它通过 xml 选择器
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • relativelayout导致动画不起作用?

    我有一个活动 其布局仅包含一个 VideoView 这是 XML
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 使用 DataBinding 测试片段时膨胀类 Fragment 时出错

    有人可以帮我解决这个问题吗 在我的测试中 我想检查登录按钮是否显示在起始页上 今天我已经为这个错误苦苦挣扎了一段时间 我不知道应该如何解决它 我在这里错过了什么 也许这个问题与这个问题有些相似 Espresso 测试失败 并显示 java
  • Android 和 Google 地图内部片段以及其他控件和 viewpager

    我是android编程新手 我有一个带有 3 个页面 片段 的小应用程序 使用 pageradapter 和 viewpager 在它们之间滑动 其中一个页面包含复选框 和其他控件 和地图 我的问题是程序在启动时崩溃 Fragment co
  • 如何在android中的谷歌地图上聚焦标记

    我只是想知道我们是否可以关注 Android 应用程序中添加的标记 如果是 怎么办 或者有没有其他方法可以完成这项任务 可以说我使用下面的代码添加了一个标记 map addMarker new MarkerOptions title tit
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在
  • Android - 状态栏阻止全屏

    我的应用程序启动时可以全屏正确运行 然而 在最小化然后返回应用程序后 状态栏会弹出 并将我的视图向下推一点 如何防止状态栏移动我的视图 这是我的布局
  • Android Google Map V2:如何在单击另一个标记时更改先前单击的标记的图标

    更新 我通过添加 previousMarker 对象解决了性能问题 因此 只有先前单击的标记将被删除并替换为默认图标 但是 当我单击标记时 信息窗口仍然不显示 我有一个地图视图并在上面设置了一些标记 我想要的是 当我单击一个标记时 它将其图
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Android 的 Intent 和 Parcelable 对象

    为什么我需要打包我的对象 即使我只需将其发送到同一任务的另一个线程 实际上 我需要打开一个甚至可以在同一线程 主线程 上运行的活动 换句话说 为什么 Google 不提供一个 startActivity 版本 它采用通用对象广告参数而不是捆
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐

  • Unity基础知识及一些基本API的使用

    Unity基础知识及一些基本API的使用 1 Unity界面介绍 Unity的默认Editor窗口主要呈现为以上布局 它们分别为 1 工具栏 工具栏提供最基本的工作功能 左侧的按钮用于访问 Unity Collaborate Unity 云
  • OC5228 100V多功能LED恒流驱动器-高辉调光 65536:1 调光比

    同脚位拼对拼替代智芯HI7001 磁吸灯 舞台灯电源方案新贵 概述 OC5228 是一款外围电路简单的多功能平均电流型LED 恒流驱动器 适用于5 100V 电压范围的降压BUCK 大功率调光恒流LED 领域 芯片PWM 端口支持超小占空比
  • React学习(懒加载)

    学习目标 提示 10分钟学会组件懒加载 1 路由懒加载 SPA应用中 为了优化首页加载和渲染性能 让路由页面组件按需访问加载 解决方案 路由懒加载 代码操作 编辑App jsx import App css 引入页面组件 import Lo
  • 太不可思议了,我的文章居然有人转载

    今天无意间逛Google 发现有人转载我的垃圾文章 简直不可思议 http www newbooks com cn info 50429 html 本来是写起耍的 算是整理加一点实际经验写成的 让我又高兴又惭愧 惭愧文章写的差 高兴我的文章
  • js遍历数组中的对象并拿到值

    拿到一组数组 数组中是对象 想拿到这个对象里面的某个值 可以参考以下例子 这样就拿到所有n1的值 想拿到这个对象里面所有对应的值如下 也可以这样取值 往数组里面push多个值 js中 用法 双叹号可以理解为将其强制类型转换为布尔值 例如 a
  • WebSocket协议深入理解

    1 WebSocket和HTTP的关系 WebSocket只有在建立握手连接的时候借用了HTTP协议的头 连接成功后的通信部分都是基于TCP的连接 总体来说 WebSocket协议是HTTP协议的升级版 2 研究WebSocket的思路 服
  • cortex-M3 异常-- SVC、PendSV介绍

    出处 http blog csdn net guozhongwei1 article details 49544671 问 ucos 任务切换时机 如何满足实时性 找上SVC PendSV啦 先了解下 以下出自 cortex M3权威指南
  • C语言中3种不同出错处理方式的优缺点

    这个是我在 数据结构习题集 上看到的一个习题 攒下来自己收藏 非原创 在程序设计中 常用下列三种不同的出错处理方式 1 用EXIT语句终止执行并报告错误 2 以函数的返回值区别正确返回或错误返回 3 设置一个函数变量的函数参数以区别正确返回
  • 移动开发!如何快速的开发一个完整的直播app,架构师必备技能

    金九银十过后各大网络平台都是各种面经分享 包括已收offer 或面试失败的都有 相信大部分人都拿到了自己心仪的大厂offer 不过也有没有少数没能进到自己内心向往的大厂而懊恼的 那么到底如何才能进大厂 该准备些什么才能进大厂 此时字节总监有
  • 有些so文件没有导入到lib目录问题解决

    在使用第三方sdk或者第三方库时 经常在libs目录下 会有一些so文件 比如高德地图的3Ddemo 就包含两个含有so文件的目录 而有的第三方不止两个目录的so文件 正常是这样子的 有多个文件目录的 但是 如果有的sdk只有两个关于so文
  • 给定一个数字范围,求一个数出现的次数

    题目 输入 29 33 3 输出 5 3出现5次 import sys def find lis start lis 0 end lis 1 m lis 2 n 0 for i in range start end 1 j i while
  • 前端单元测试03之Sion

    前端单元测试03之Sion 前端测试存在的问题 在讲Sinon之前 我们得先讲一下在学习了Mocha chai以及enzyme之后 我们的前端测试还存在的一些问题 比如前台测试需要与后台交互 获取后台数据后再根据相应数据进行测试 又比如一个
  • 关于微信小程序使用JavaScript实现检索算法

    检索算法 拟解决生活中最常见的问题之一 检索问题 查找问题 wxml wxss js 拟解决生活中最常见的问题之一 检索问题 查找问题 该问题要求在一个列表中查找某个具体元素是否出现 若出现 返回具体元素在数组中的位置 否则返回 1 根据列
  • 论文翻译(11) — livox_camera_calib标定论文

    目录 1 引言 2 原理 A 概述 B 边缘提取和匹配 C 外部标定 D 对标定结果上边缘分布的分析 E 初始化和粗略标定 论文链接 https arxiv org pdf 2103 01627v2 pdf 源码链接 https githu
  • 如何判断Linux服务器是否被入侵?

    1 如何判断自己的服务器是否被入侵 背景 随着开源产品的越来越盛行 作为一个Linux运维工程师 能够清晰地鉴别异常机器是否已经被入侵了显得至关重要 个人结合自己的工作经历 整理了几种常见的机器被黑情况仅供参考 以下情况是在CentOS 6
  • 光模块SFP+与SFP、XFP、QSFP、QSFP+的区别

    光收发模块 一 光收发一体模块定义 光收发一体模块由光电子器件 功能电路和光接口等组成 光电子器件包括发射和接收两部分 发射部分是 输入一定码率的电信号经内部的驱动芯片处理后驱动半导体激光器 LD 或发光二极管 LED 发射出相应速率的调制
  • K8S 使用 SideCar 模式部署 Filebeat 收集容器日志

    对于 K8S 内的容器日志收集 一般有两种常用的方式 1 使用 DaemonSet 在每台 Node 上部署一个日志收集容器 用于收集当前 Node 上所有容器挂载到宿主机目录下的日志 2 使用 SideCar 模式将日志收集容器与业务容器
  • python基础运用

    列表有索引 下标 字符串有 格式化字符串 str1 xxx 0 sss 1 format 哈哈 100 print str1 print xxx sss d 哈哈 100 name 张三 age 18 hobby 唱 跳 rap 篮球 张三
  • 计算机世界规整_20211110_周三

    计算机世界规整 20211110 周三 扫我查看
  • Android 4.4.2引入的超炫动画库

    酷炫 作者博客 http rkhcy github io 源码地址 https github com Rkhcy TransitionNote Google Demo https github com android platform fr