type
status
date
slug
summary
tags
category
password
icon

过渡动画使⽤

有两种使⽤⽅式
  • TransitionManager#beginDelayedTransition
  • TransitionManager#go()
其中使⽤ go() 调⽤,需要重新绑定数据(因为 View 会被重新添加)。
💡
过渡动画和属性动画的区别 过渡动画是创建一个开始状态,和一个结束状态,有过渡动画将开始状态切换到结束状态,这个过程中,会真正的修改组件的属性。 属性动画是基于组件的属性做缩放/位移/旋转,但组件实际的属性并未修改(实际修改了,但是不会影响到其他组件)

过渡动画原理

过渡动画指的是两个场景之间的过渡,⼀个「开始场景」⼀个「结束场景」
  1. 我们就要从场景上记录⾥⾯控件的各种参数
  1. 根据两个场景的各种参数,创建出属性动画,播放属性动画
对应 Transition 上的关键函数
  1. 捕获并记录对应属性
    1. captureStartValuescaptureEndValues
  1. 基于捕获的值创建对应动画,并播放动画
    1. createAnimatorplayTransition

MotionLayout

MotionLayout 使⽤

  • ConstraintLayout 改为 MotionLayout
  • 创建 MotionScene ⽂件并使⽤ app:layoutDescription 关联
💡
MotionLayout 继承了 ConstraintLayout

Constraint 节点

  • 运动模型
    • 弧线路径,时间模型等
  • 布局相关
    • 注意, width 、 height 和 margin 的命名空间是 android: (beta1 开始)⽽约束相关的命名空间是 app (或 motion )
  • 动画变换
    • 做旋转,位移,缩放,海拔等属性
  • ⾃定义属性
    • attributeName 会加上 set/get 反射找到真正的函数名,⽐如 backgroundColor 就会调⽤ setBackgroundColor() 函数
    • custom(xxx)Value 对应属性的数据类型
  • 特定的属性
    • visibilityalpha 等属性

时间模型

  • 每个控件可以单独设置时间模型
    • <Motion> 节点中使⽤ app:transitionEasing
  • 整个 Transition 也可以设置插值器
    • <Transition> 中使⽤ app:motionInterpolator

MotionScene

Transition 节点

  • motion:motionInterpolator:设置全局的运动差值器。

onSwipe

<OnSwipe> 添加在 <Transtion> 节点中⽀持的参数:
  • touchAnchorId 指的是哪⼀个控件响应触摸事件。
  • dragDirection 拖拽的⽅向
    • onTouchUp 默认是autoComplete ,会根据动画完成的百分⽐⾃动到最近的⼀个状态

    OnClick

    • targetId 指定控件
    • clickAction
      • toggle 反转状态
      • transitionToEnd/Start 通过动画到结束/起始状态
      • jumpToEnd/Start 没有动画直接到结束/起始状态
     

    KeyFrameSet

    内部的子标签都具有下面两个属性:
    • app:motionTarget ⽬标对象 id
    • app:framePosition 动画完成度百分⽐ (0 ‐ 100)
     

    KeyAttribute 属性关键字

    可以设置位移,旋转,缩放等属性,同时还可以通过 CustomAttribute 添加⾃定义属性

    KeyPosition 位置关键帧

    percentX/Y 在关键帧时,对应路径的对应百分⽐
    percentWidth/Height 在关键帧时,控件⼤⼩改变的百分⽐
    curveFit 运动路径的样式(直线,曲线等)
    motion:pathMotionArc 设置运动轨迹的模式,使用时开始位置也需要设置该属性,通过如下方式:
    keyPositionType 坐标系 (结合课上的画图理解)
    • parentRelative
      • (0,0)为⽗容器左上⻆
        (1,1)为⽗容器右下⻆
    • deltaRelative
      • (0,0)为起始控件中⼼
        (1,1)为结束控件中⼼
    • pathRelative
      • (0,0)为起始控件中⼼
        (1,0)为结束控件中⼼
         

    KeyCycle 和 KeyTimeCycle

    通过 3 个 KeyCycle 定义⼀个准确的循环关键帧
    wavePeriod 循环次数 (KeyTimeCycle 表示的每秒循环次数)
    waveShape 数学模型
     

    KeyTrigger

    绑定触发指定方法
    例如:在动画正向执行到 80% 时,调用 @id/view 这个 View 的 hide 方法
    如果想要触发的方法不存在,也可以对 MotionLayout 设置监听

    ConstraintSet

    • android:id="@+id/[start|end]" 设置开始和结束时,动画的状态

    ConstraintOverride

    Constraint

    • android:id="@+id/view" 所对应的 View 的 id
    💡
    也可以像这么写 Constraint
    这种写法就是把原来布局中 View 的布局直接搬过来,就表示这个 View 这时的状态。那么开始和结束的状态就必须将这些属性都带上,不然就会使用默认值。 而使用下面的子节点的方式,就可以专门针对性的控制,不用把所有的属性都带上。
    子节点有
    • Layout
      • 节点的布局状态
    • Motion
      • motion:pathMotionArc 设置运动轨迹的模式
      • motion:transitionEasing 设置运动速度模型
    • CustomAttribute
      • app:attributeName=”backgroundColor” 自定义属性名
      • app:customXxxxValue=“value” 该属性的值
    • PropertySet
      • android:alpha
      • android:visibility
      • app:visibilityMode
      • app:layout_constraintTag
      • app:motionProgress
    • Transform
      • android:rotation 设置旋转
      • android:scaleX/Y 设置缩放
     
     
    多线程和线程同步ConstraintLayout 详解
    Loading...
    shuouyang
    shuouyang
    android开发 ReactNative开发 小程序开发
    最新发布
    AOSP 环境搭建
    2025-3-29
    View 绘制流程-源码解析
    2025-3-12
    HTTP
    2025-3-4
    JVM 虚拟机
    2025-2-28
    蓝牙-BLE-基础
    2025-2-28
    从 OkHttp 的原理来看 HTTP
    2025-2-19
    公告
    🎉热点信息🎉
    --- 1 ---
    Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
    --- 2 ---
    新的小巧便捷的依赖注入框架 Koin
    --- 3 ---
    新一代 API 查询语言 GraphQL