Android利用ConstraintLayout实现漂亮的动画详解

前言

最近ConstrainLayout是Android中比较火的一个东西。ConstrainLayout可以使View层级扁平化,提升性能,支持任意的边框,其目的就是修复之前layout的一些短板。其实ConstrainLayout还有一个大多数人没有注意到的特性:可以利用Constrainlayout快速构建漂亮的动画效果。

方法

我这里假设已经你已经掌握了Constrainlayout基本知识(比如:app:layout_constraintLeft_toLeftOf等)。Constrainlayout可以通过TransitionManager 在两组constraints之间执行动画(需要API>19或者使用support library),以下是一个demo。

Simple demo

我们先写一个xml布局:

<!-- activity_main.xml -->
<android.support.constraint.ConstraintLayout ...>

 <ImageView
 android:id="@+id/image"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 ... />

 <Button ... />

</android.support.constraint.ConstraintLayout>

到目前为止,这只是一个普通的xml布局,我们再定义另一个布局:

<!-- activity_main_alt.xml -->
<android.support.constraint.ConstraintLayout ...>

 <ImageView
 android:id="@+id/image"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 **app:layout_constraintTop_toTopOf="parent"
 app:layout_constraintBottom_toBottomOf="parent"**
 ... />

 <Button ... />

</android.support.constraint.ConstraintLayout>

这两个布局只有ImageView的高度不同,为了执行动画,只需要在Activity中写几行代码即可:

override fun onCreate(savedInstanceState: Bundle?) {
 ...
 val constraintSet1 = ConstraintSet()
 constraintSet1.clone(constraintLayout)
 val constraintSet2 = ConstraintSet()
 constraintSet2.clone(this, R.layout.activity_main_alt)

 var changed = false
 findViewById(R.id.button).setOnClickListener {
 TransitionManager.beginDelayedTransition(constraintLayout)
 val constraint = if (changed) constraintSet1 else constraintSet2
 constraint.applyTo(constraintLayout)
 changed = !changed
 }
}

代码使用Kotlin写的,即使没有学过,基本也没有什么障碍,不过还是很有必要学习一下的。

代码中我们使用TransitionManager在Constrainlayout中启动了一个延时动画,TransitionManager在交换两种布局时会自动使用动画。

重复的xml Layout

这种方式使用了两个xml布局,是否重复了呢,没有人喜欢重复的代码。

其实没有你想的那么糟糕,如果为了动画的目的定义多余的xml,可以省略所有的非布局属性(如textSize等属性)。Constrainlayout会自动捕获所有layout的基本约束属性并抛弃其中的一些。

如果你还是想避免重复的代码,还可以在代码中动态修改约束属性:

override fun onCreate(savedInstanceState: Bundle?) {
 ...
 val constraintSet1 = ConstraintSet()
 constraintSet1.clone(constraintLayout)
 val constraintSet2 = ConstraintSet()
 constraintSet2.clone(constraintLayout)
 constraintSet2.centerVertically(R.id.image, 0)

 var changed = false
 findViewById(R.id.button).setOnClickListener {
 TransitionManager.beginDelayedTransition(constraintLayout)
 val constraint = if (changed) constraintSet1 else constraintSet2
 constraint.applyTo(constraintLayout)
 changed = !changed
 }
}

使用transition 框架也可以实现这些动画

当然可以这样,我们可以通过使用transition框架或者使用属性设置也可以实现动画。然而,当需要的动画可通过使用特定的约束来实现时,ConstrainLayout的方法就很有效,否则就需要大量的代码来实现动画效果。

另一个使用场景是当很多元素需要动效时,看一个例子:

使用ConstrainLayout可以实现以上的效果,通过指定不同的xml,动画就会自动执行。

注意事项

1. 启动动画的方法:

TransitionManager.beginDelayedTransition(constraintLayout)

2. 自定义动画

还可以自定义Transition:

val transition = AutoTransition()
transition.duration = 1000
TransitionManager.beginDelayedTransition(
 constraintLayout, transition)

3. 嵌套问题

ConstraintLayout只可以对其直接子View执行动画,这就意味着它不能很好地处理嵌套的ViewGroup。在以上的例子中,CardView中的TextView还需要手动处理动画,也许可以通过嵌套ConstrainLayout来实现,但是我并没有进行实验。

4. 非布局属性

ConstraintLayout只支持约束布局的动画,不支持其他属性(如坐标修改,文字修改等)。

5. 其他

如果动态修改ConstraintLayout中元素的基本布局属性(比如使用translationY),动画后并不会同步这个变更,也就是说动画执行后,之前修改的属性将会复原。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android新布局方式ConstraintLayout快速入门教程

    前言 在Android开发中,我们通常是手写布局,很少会用拖动来写布局,虽然ConstraintLayout在I/O上以拖动来展现了各种功能,我估计在以后开发中,程序员还是习惯手撸代码. 我自己试着拖着用了一下,用得不是很明白 ,而且用起来效果不是很好. 那么 直接上手撸了一下~~~ 其实很简单 Button1:app:layout_constraintBottom_toTopOf="@id/iv_head" 我们把这个属性拆开来看,constraintBottom指的本身的底部,即B

  • Android新特性ConstraintLayout完全解析

    本文同步发表于我的微信公众号,在微信搜索 郭霖 即可关注,每天都有文章更新. 今天给大家带来2017年的第一篇文章,这里先祝大家新年好. 本篇文章的主题是ConstraintLayout.其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能.我们都知道,在传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方

  • Android利用ConstraintLayout实现漂亮的动画详解

    前言 最近ConstrainLayout是Android中比较火的一个东西.ConstrainLayout可以使View层级扁平化,提升性能,支持任意的边框,其目的就是修复之前layout的一些短板.其实ConstrainLayout还有一个大多数人没有注意到的特性:可以利用Constrainlayout快速构建漂亮的动画效果. 方法 我这里假设已经你已经掌握了Constrainlayout基本知识(比如:app:layout_constraintLeft_toLeftOf等).Constrai

  • Android开发之自定义加载动画详解

    目录 一.demo简介 二.分析贪吃动画的尺寸比例 三.画圆 四.实现张嘴闭嘴动画 五.小球移动动画 一.demo简介 1.效果展示如下图,我截了三个瞬间,但其实这是一个连续的动画,就是这个大圆不停地吞下小圆. 2.这个动画可以拆分为两部分,首先是大圆张嘴闭嘴的动画,相当于画一个圆弧,规定一下它的角度就好.小圆就是一个从右向左移动的动画.然后不停地刷新界面,让动画的持续时间为永恒,这样就会有一个持续的动态效果. 二.分析贪吃动画的尺寸比例 1.在制作动画之前,我们要先建一个模型,来确定一下大圆和

  • Android源码解析之属性动画详解

    前言 大家在日常开发中离不开动画,属性动画更为强大,我们不仅要知道如何使用,更要知道他的原理.这样,才能得心应手.那么,今天,就从最简单的来说,了解下属性动画的原理. ObjectAnimator .ofInt(mView,"width",100,500) .setDuration(1000) .start(); ObjectAnimator#ofInt 以这个为例,代码如下. public static ObjectAnimator ofInt(Object target, Stri

  • Android利用EditText如何实现搜索框详解

    EditText简介: ED(EditText的简称)在开发中也是经常使用到的一个控件, 也是一个比较重要的组件,可以说它是用户跟应用进行数据传输的窗口,比如实现一个登陆界面, 需要用户输入账号和密码,然后我们开发者获取到用户输入的内容,提交给服务区进行判断再做相应的处理. 引言 新的app中有search的功能需要实现,就是一个输入框,输入文字后键盘出来搜索字样,然后点击搜索进行网络请求.之前掉坑里了,一直尝试用searchview来实现,但是自定义样式上实在是坑,最后发现其实EditText

  • 利用Android实现光影流动特效的方法详解

    目录 前言 MaskFilter 类简介 MaskFilter 的几种效果对比 光影流动 光影流动效果1 光影流动效果2 光影流动效果3 光影流动效果4:光影沿贝塞尔曲线流动 总结 前言 Flutter 的画笔类 Paint 提供了很多图形绘制的配置属性,来供我们绘制更丰富多彩的图形.前面几篇我们介绍了 shader 属性来绘制全屏渐变的聊天气泡背景.渐变流动的边框和毛玻璃效果的背景图片,具体可以参考下面几篇文章. 让你的聊天气泡丰富多彩! 手把手教你实现一个流动的渐变色边框 利用光影变化构建立

  • Android 三种动画详解及简单实例

    Android 三种动画详解 帧动画 一张张图片不断的切换,形成动画效果 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="

  • Android音频开发之SurfaceView的使用详解

    目录 SurfaceView 不同点 双缓冲机制 SurfaceHolder 使用 SurfaceView SurfaceView从源码上看继承自View,但在内部实现上SurfaceView和其他View有很多区别. SurfaceView主要作用是提供一个直接绘图表面嵌入到视图结构中,实际上真正做绘制能力的是Surface.因此SurfaceView和宿主窗口是分离的.正常情况下窗口的View共享同一个Window,而Window也对应一个Surface,所有View也就共享同一个Surfa

  • Android开心消消乐代码实例详解

    突然想要在android上写一个消消乐的代码,在此之前没有系统地学过java的面向对象,也没有任何android相关知识,不过还是会一点C++.8月初开始搭建环境,在这上面花了相当多的时间,然后看了一些视频和电子书,对android有了一个大概的了解,感觉差不多了的时候就开始写了. 疯狂地查阅各种资料,反反复复了好几天后,也算是写出了个成品.原计划有很多地方还是可以继续写下去的,比如UI设计,比如动画特效,时间设计,关卡设计,以及与数据库的连接,如果可以的话还能写个联网功能,当然因为写到后期内心

  • Android 实例开发一个学生管理系统流程详解

    目录 效果演示 实现功能总览 代码 登录与忘记密码界面 一.添加布局文件 二.添加标题文字 三.绑定适配器 注册界面 一.创建两个Drawable文件 二.将其添加数组内 三.动态变化背景 考勤界面 一.CircleProgressBar代码如下 签到界面 一.倒计时 二.位置签到 成绩查询界面 一.创建StackAdapter 适配器 效果演示 随手做的一个小玩意,还有很多功能没有完善,倘有疏漏,万望海涵. 实现功能总览 实现了登录.注册.忘记密码.成绩查询.考勤情况.课表查看.提交作业.课程

  • Android开发Jetpack组件DataBinding用例详解

    目录 简介 使用方式 1. build.gradle 中添加 kapt,并启用dataBinding 2.修改布局文件,添加 layout 和 data 标签 3.使用 DataBindingUtil 绑定布局 4.布局的 data 标签中添加数据变量,并使用其参数 5.BindingAdapter的使用 简介 DataBinding 是 Jetpack 组件之一,适用于 MVVM 模式开发,也是Google官方推荐使用的组件之一.使用DataBinding可以很容易的达到视图与逻辑分离,直接在

随机推荐