constraintlayout2.0一篇写不完之viewtransition

eclipse_xu eclipse_xu     2022-12-24     469

关键词:

点击上方蓝字关注我,知识会给你力量

ViewTransition是ConstraintLayout2.x中的一个新标签,它可以让你在MotionLayout中指定单个视图的动画。这允许你处理复杂的动画和交互,而不必将所有可能的组合定义为ConstraintSets。

这么说有点抽象,我们来看下面这个例子。

想象一下,假如你有一个3x3的键盘,你想在键盘上的每个按钮被点击的时候为它们制作动画。在使用ViewTransition之前,你需要创建10个独立的ConstraintSets(1个用于所有处于静止状态的按钮,9个用于每个按钮的动画),同时重复9次类似的动画。当然,这是在你对一次只做一个按钮的动画感到满意的情况下,而如果你想要更复杂的动画模式,比如,两个或更多的按钮可以同时做动画,组合的数量会迅速爆炸。

相反,使用ViewTransition,你可以为你想要的按钮动画定义一个单一的通用动画(例如,按钮的倾斜效果),然后在一个特定的视图上运行它,基本上可以让你在现有的View上直接应用这个动画效果。

这也是一个重复使用特定动画的好方法(参见MotionEffect的使用,它可以利用ViewTransition的优势来实现多个元素的动画效果)。

The attributes

下面是ViewTransition的一些属性列表。

<ViewTransition
        android:id="@+id/spin_equ"
        motion:motionTarget="@+id/button10"
        motion:viewTransitionMode="noState"
        motion:onStateTransition="actionDown"
        motion:duration="600"
        motion:pathMotionArc="none"
        motion:motionInterpolator="linear"
        motion:setsTag="@id/sets_tag_on_done"
        motion:clearsTag="@id/clears_tag_on_done"
        motion:ifTagSet="@id/only_run_if_set"
        motion:ifTagNotSet="@id/only_run_if_not_set"
      >
     <ConstraintOverride ....> 
       <CustomAttribute ...\\>
     </ConstraintOverride>
    
    <KeyFrameSet>
         ...
    </KeyFrameSet>
  </ViewTransition>
  • id:用于在代码中,用motionLayout.viewTransition(id, view...)调用

  • motionTarget:用来定义View,或者是通过layout_constraintTag指定的View的集合

  • viewTransitionMode:定义了ViewTransition的三种主要模式:currentState、allStates和noState。(noState在每个视图中异步运行)

  • onStateTransition:允许在actionDown或actionUp上进行ViewTransition

  • duration:ViewTransition的持续时间,以毫秒为单位

  • transitionDisable:可以创建允许禁用的ViewTransition,在代码中可以用motionLayout.enableViewTransition(id)启用

  • pathMotionArc:已arc方式修改移动路径

  • motionInterpolator:修改插值器

  • setsTag:on completion of a ViewTransition on a view it calls view.setTag(id, System.nanoTime)

  • clearsTag:on completion of a ViewTransition on a view it calls view.setTag(id, null)

  • ifTagSet:如果view.getTag(id) == null,ViewTransition将不会运行

  • ifTagNotSet:如果view.getTag(id) !=null,则ViewTransition不会运行

Running a View Transition

有3种方法来运执行ViewTransition:

  1. 使用motion:onStateTransition="... "来自动执行

  2. KeyTrigger可以启动视图转换

  3. 以编程方式启动从代码中启动

Launching a View transition from code

MotionLayout有几个API用于处理ViewTransition。

// Execute a ViewTransition.
// Transition will execute if its conditions are met and it is enabled
public void viewTransition(int viewTransitionId, View... view)   

//Enable a ViewTransition ID.
public void enableViewTransition(int viewTransitionId, boolean enable)  

// Is transition id enabled or disabled
public boolean isViewTransitionEnabled(int viewTransitionId)  

// Apply the view transitions keyFrames to the MotionController.
// Note ConstraintOverride is not used
public boolean applyViewTransition(int viewTransitionId, MotionController motionController)  

ViewTransitions允许你将逻辑与动画分开。例如,如果你设置了Visibility为invisible,那么它就会被移除,但在这个移除的过程中,你就可以设计退出的动画效果。

Example 1 Simple Popup

这个动画会在点击时会放大,释放后会还原。

<ViewTransition
    android:id="@+id/pop"
    motion:duration="300"
    motion:motionTarget="@+id/button1"
    motion:onStateTransition="actionDownUp"
    motion:viewTransitionMode="noState">
    <KeyFrameSet>
        <KeyAttribute
            android:scaleX="1.5"
            android:scaleY="1.5"
            motion:framePosition="100" />
    </KeyFrameSet>
</ViewTransition>
126887330-61c2fd78-0c4a-4d07-bd60-2ae93ba3bc5a

Example 2 Fancy Pop Button

<ViewTransition
    android:id="@+id/bigPop2"
    motion:duration="3000"
    motion:motionTarget="@+id/button15"
    motion:onStateTransition="actionDownUp"
    motion:upDuration="300"
    motion:viewTransitionMode="noState">

    <KeyFrameSet>

        <KeyAttribute
            android:scaleX="3"
            android:scaleY="3"
            motion:framePosition="100" />
        <KeyTimeCycle
            android:rotation="0"
            motion:framePosition="0"
            motion:wavePeriod="4" />
        <KeyTimeCycle
            android:rotation="0"
            motion:framePosition="80"
            motion:wavePeriod="4" />
        <KeyTimeCycle
            android:rotation="20"
            motion:framePosition="99"
            motion:wavePeriod="4" />

    </KeyFrameSet>
</ViewTransition>
126887406-0dab6878-6ea9-458b-8392-364e9b73b910

Example 3 Removes the button for the current state

<ViewTransition
    android:id="@+id/gone"
    motion:duration="300"
    motion:motionTarget="@+id/button3"
    motion:onStateTransition="actionUp"
    motion:viewTransitionMode="currentState">
    <ConstraintOverride android:visibility="gone" />
</ViewTransition>

简单的说,ViewTransition就是一个动画和组件分离的工具,你可以借助ViewTransition,将组件的动画抽取出来,做到复用。

本文翻译自https://github.com/androidx/constraintlayout/wiki/ViewTransition

向大家推荐下我的网站 https://xuyisheng.top/  点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

往期推荐

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

< END >

作者:徐宜生

更文不易,点个“三连”支持一下????

constraintlayout2.0一篇写不完之stagger交错

点击上方蓝字关注我,知识会给你力量在Flutter中,有个StaggerAnimation,可以实现交错动画效果,这个效果相当于在申明式编程中为多个动画增加了多条时间线,在Android中,以往要实现交错动画效果,需... 查看详情

constraintlayout2.0一篇写不完之嵌套滚动怎么滚

点击上方蓝字关注我,知识会给你力量在ConstraintLayout1.x阶段,它主要提供的能力是对静态布局的支撑,那么到2.x之后,MotionLayout的拓展,让它对动态布局的支持有了进一步的优化,在1.x阶段不能实现的嵌... 查看详情

constraintlayout2.0一篇写不完之极坐标布局与动画

点击上方蓝字关注我,知识会给你力量相对于一般布局方式的笛卡尔坐标系,MotionLayout还拓展了ConstraintLayout中的相对中心布局方式,我们暂且称之为「极坐标布局」方式。极坐标布局方式在某些场景下,比笛卡尔... 查看详情

有趣的灵魂(一篇写不完的博文)

爱情始于五官,陷于三观,忠于有趣的灵魂导读:一段爱情,因五官而始,因三观而终,因有趣而美好。余生很长,找个有趣的人在一起才不会感觉难熬;余生很短,找个有趣的人在一起才会每天都值得。01我们都知道,好看的... 查看详情

java基础

上面一篇写不完NumberFormat类的子类ChoiceFormat类,这一篇接着写ChoiceFormat类,借鉴了下面看一下ChoiceFormat类中的几个常用方法1.nextDouble(doubled)静态方法查找大于d的最小double值,用在limits数组中,从而使limits数组形成一个右开区间... 查看详情

java小白入门系列第一篇写在前面

...云     Sue    Java小白入门系列第一篇 写在前面  写在前面:   首先声明一下,本人也是正在学Java,并不是多么专业人士,只是最近受老师的启发,所以准备写个关于java新手入门系列的博客,... 查看详情

ConstraintLayout 2.0 渲染问题

】ConstraintLayout2.0渲染问题【英文标题】:ConstraintLayout2.0renderingproblems【发布时间】:2020-12-1223:22:54【问题描述】:更新到ConstraintLayout2.0后,我意识到即使是最简单的布局也无法在AndroidStudio中正确预览,无论是在OSX还是Ubuntu上。... 查看详情

为啥我的postgresql的sqlshell执行不了命令

参考技术A您好.对应不同的用户角色。=#管理员-#管理员一行语言写不完,换行了=>一般用户->一般用户一行语言写不完,换行了 查看详情

自己做系统的历程

文章一次写不完,应该分几次写吧,第一篇先展现下界面和大致代码,下次开始慢慢讲首页是晚上刚刚做好的,就写了几个说明而已这是菜单管理,看了一些文章,说做系统时菜单是固定死要好,实际业务中不可能会经常变动菜... 查看详情

新媒体运营写不出来文章怎么办?

...文章怎么办呢?其实对于很多文案工作者来说,要想写出一篇出彩的文章,除了需要有一定的文字功底外,还需要灵感和 查看详情

android新控件之motionlayout动画管理布局简单介绍<一>

...tionLayout是做什么的呢????,MotionLayout怎么用呢???MotionLayout是ConstraintLayout2.0版本以后新增的一个继承于ConstraintLayout的一个新布局MotionLayout是一种布局类型,可帮助您管理应用中的运动和微件动画。MotionLayout是ConstraintLayout的子类,在... 查看详情

小计划

...率不是太高......   所以我极度怀疑,我这几天写不完所有的总结......    但是我还是一定要补的![笑哭]    另外,有时剩下一些零散的时间,或者是出些小意外(比如现在门关了.......),我就发一... 查看详情

梦幻西游无法运行,每次运行都是到更新完之后进入主界面时出现程序“卡死”现象。

梦幻西游无法运行,每次运行都是到更新完之后进入主界面时出现程序“卡死”现象。不是系统问题,我换了几个系统都是这样,我的配置也不低啊,不会是硬件也可以不兼容吧!参考技术A网速的问题,或者显示器分辨率调下... 查看详情

自己喜欢的一些句子摘录-2018-04-05

...己,未尝不可,至少让自己明白,生活除了加不完的班,写不完的作业,还有一些小惊喜的正在萌发,即使这些“惊喜”是自己预谋创造的。有些生活不为别人,只为自己。自我取悦,并不是一种对外界的炫耀,而是一种... 查看详情

numpy学习笔记

...行数据分析这本书,准备写一个系列的学习笔记,这是第一篇,什么时候想起来就什么时候写点。第一篇写的是numpy的基本用法。   numpy是python的一个科学计算库,是很多python科学计算库的基础,这是一个非常大的科... 查看详情

烟-夜深词一首(原创)

...掙脫了鎖鏈,圈走了尘煩。身边没有烟进退皆维艰。代码写不完,文档放一边。节奏有点慢,徘徊在兩端。到底干不干,决心再一战。  查看详情

rtb竞价流控-budgetpacing

前言前一篇写了关系rtbbiddingstragegy的相关内容,这一篇主要介绍的是RTB竞价中的流控策略:budgetpacing,主要内容是让广告主预算平稳花完,防止出现预算突然花完这种情况。[注:本笔记主要围绕着DisplayAdvertisi... 查看详情

给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐

...cn;/***@authorSummer* 给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐。*/publicclassTest_Method12 publicstaticvoidmain(String[]args) intmoney=20,price=3; //bottle表示每一次购买的可乐瓶数 intbottle=0; /... 查看详情