原文地址:http://android.xsoftlab.net/training/transitions/custom-transitions.html

自定义转场可以创建自定义动画。比如,可以定义一种动画来更改文本的颜色或者将输入框的颜色置灰以表示不可用。

自定义转场与内置转场相同,都作用在View之上。不过与内置转场不同的是,还需要另外写一些代码来捕获转场过程的属性值,并生成相关动画。

这节课将会学习如何获取属性值,并生成相关动画。

继承Transition类

为了创建自定义转场,需要继承Transition,并重写以下方法:

public class CustomTransition extends Transition {@Overridepublic void captureStartValues(TransitionValues values) {}@Overridepublic void captureEndValues(TransitionValues values) {}@Overridepublic Animator createAnimator(ViewGroup sceneRoot,TransitionValues startValues,TransitionValues endValues) {}
}

下面的部分会学习如何重写这些方法。

获取View的属性值

转场动画使用了属性动画系统。属性动画通过更改View的属性实现了属性动画,所以转场框架需要使用属性的启动值与结束值来构造动画。

属性动画通常只会用到View的极少属性。比如,颜色动画需要颜色属性值,平移动画需要位置属性值。因为转场动画只需要某些特定的属性值,所以转场框架并没有将所有的属性值提供给转场动画。相反的,转场框架会调用回调方法以便允许转场动画获得需要的属性值,并将其存入框架中。

获得起始值

为了可以将起始的View值传给转场框架,需要实现captureStartValues(transitionValues)方法。转场框架会在每个View处于启动场景时调用该方法。这个方法的参数是一个TransitionValues对象,这个对象包含了View的引用及一个Map对象,你可以将View的属性值存放在这个Map对象中,然后这些值就会被传给转场框架。

为了确保所存储的属性值的键不会与其它TransitionValues的键相冲突,可以使用以下命名规则:
package_name:transition_name:property_name

下面的代码展示了captureStartValues()方法的实现:

public class CustomTransition extends Transition {// Define a key for storing a property value in// TransitionValues.values with the syntax// package_name:transition_class:property_name to avoid collisionsprivate static final String PROPNAME_BACKGROUND ="com.example.android.customtransition:CustomTransition:background";@Overridepublic void captureStartValues(TransitionValues transitionValues) {// Call the convenience method captureValuescaptureValues(transitionValues);}// For the view in transitionValues.view, get the values you// want and put them in transitionValues.valuesprivate void captureValues(TransitionValues transitionValues) {// Get a reference to the viewView view = transitionValues.view;// Store its background property in the values maptransitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());}...
}

获得结束值

转场框架会在每次场景结束时调用captureEndValues(TransitionValues)方法。至于其它方面,该方法内部的实现逻辑与获取开始值的逻辑一致。

下面的代码段展示了captureEndValues方法的实现:

@Override
public void captureEndValues(TransitionValues transitionValues) {captureValues(transitionValues);
}

在这个示例中,captureStartValues()方法与captureEndValues()方法都会调用captureValues()方法来获取值然后存储这些值。在captureValues()方法中获取View属性都相同,只是启动场景与结束场景获得的属性值不同。转场框架对起始场景与结束场景分别维护了各自的Map实例。

创建自定义Animator

为了使View在转场的时候可以以动画的方式变动,需要重写createAnimator()方法,并返回一个Animator对象。在转场框架调用这个方法时,会将变幻场景的根View与TransitionValues对象传回。启动TransitionValues对象包含了转场过程中所捕获的属性值。

createAnimator()方法的调用取决于启动场景与结束场景变换的过程。试着将淡入淡出动画想象为自定义转场动画。如果启动场景有5个target,而到了结束场景时被移除了两个,并且还添加了一个新的target,那么转场框架会调用createAnimator()方法6次:其中三个在启动场景与结束场景中都在出现,其中两个在转变到结束场景的过程中被移除了,最后一个在转换到结束场景时被添了进去。

对于在开始场景与结束场景中都存在的target View,转场框架会在调用createAnimator()方法时将TransitionValues对象通过startValues参数与endValues参数回传。对于只存在于单个场景的target View,转场框架会通过对应的参数将TransitionValues对象回传,而另一个参数则为空。

在实现createAnimator(ViewGroup, TransitionValues, TransitionValues)方法时,使用所捕获的属性值来创建一个Animator对象,并将其返回给转场框架。对于实现的示例,请参见CustomTransition示例中的ChangeColor类。有关更多属性动画的相关信息,请参见Property Animation。

使用自定义转场动画

自定义转场动画与内置转场动画的使用方式相同。同样可以通过转场管理者使用自定义转场动画,具体使用描述请参见Applying a Transition。

Android官方开发文档Training系列课程中文版:动画视图之创建自定义转场动画相关推荐

  1. Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印

    原文地址:http://android.xsoftlab.net/training/printing/custom-docs.html 对于一些应用,比如绘图类APP,版面设计类APP以及其它APP, ...

  2. Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试

    原文地址:http://android.xsoftlab.net/training/activity-testing/activity-functional-testing.html 功能性测试包括模 ...

  3. Android官方开发文档Training系列课程中文版:Activity测试之创建单元测试

    原文地址:http://android.xsoftlab.net/training/activity-testing/activity-unit-testing.html Activity单元测试除了 ...

  4. Android官方开发文档Training系列课程中文版:Activity测试之创建运行测试

    原文地址:http://android.xsoftlab.net/training/activity-testing/activity-basic-testing.html 为了验证在布局与功能上没有 ...

  5. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  6. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  7. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  8. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

    原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...

  9. Android官方开发文档Training系列课程中文版:打印内容之HTML文档打印

    原文地址:http://android.xsoftlab.net/training/printing/html-docs.html 在Android中打印内容要比打印照片要复杂一些,它要求将文本与图像 ...

最新文章

  1. 福利 | 给你个机会与俞士纶(Philip S. Yu)面对面交流 !(附俞教授论文合集资源)...
  2. 【蓝桥杯】基础练习 十进制转十六进制
  3. linux主要系统服务介绍
  4. 微软建议的ASP性能优化28条守则
  5. 逻辑回归分类python实例_Python逻辑回归原理及实际案例应用
  6. 捕捉Web页面子类错误堆栈中的信息
  7. Delphi中的堆,栈
  8. python编程从入门到实践第八章_Python编程从入门到实践的第三天
  9. 对Spring框架的理解(转)
  10. 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
  11. ES6(Module 模块化)
  12. python 程序化交易名单_2020 Python程序化交易高级实战班 - 优量在线 - 学量化投资,到优量在线 - Powered By EduSoho...
  13. 阿里云iot平台实现MQTT通信(mqtt.fx接入iot平台及测试)
  14. Java | MySQL Emoji表情写入数据库时报错问题解决,Incorrect string value: ‘\xF0\x9F\x98\x84\xF0\x9F...‘ for column
  15. 细数互联网企业组织架构大调整
  16. pycharm连接远程服务器以及踩的坑
  17. android相机固定方向,如何正确设置Android相机方向?
  18. javaSE基础重点知识点总结 持续更新
  19. 利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息
  20. Android项目实战_手机安全卫士软件管家

热门文章

  1. 深入理解嵌入式中重要的编程模型
  2. 聊聊身边的嵌入式,乘风破浪的比特币
  3. C语言,谁都能看得懂的归并排序
  4. 马上就校招了,是要去实习还是复习?
  5. C语言实现树,你一定看得懂
  6. Android 广播接收
  7. 就业阶段-java语言进价_day05
  8. LeetCode 2165. 重排数字的最小值(计数)
  9. LeetCode 1586. 二叉搜索树迭代器 II(数组+栈)
  10. LintCode MySQL 1932/1933. 挂科最多的同学 I / II