添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
从容的炒面  ·  C# HttpClient 请求转发 - ...·  1 年前    · 
腼腆的菠菜  ·  浅谈v-slot插槽 - 掘金·  1 年前    · 

ConstraintLayout 有一些自己的动画效果,比如: MotionLayout ConstraintSet 。这里记录其中之一的 ConstraintSet 的使用方式。其实这个动画方式是可以用 MotionLayout 替换掉的,而且会更简单

二、使用方式

1、使用范围

使用 ConstraintSet 进行动画可以使布局的关键帧进行动画移动,但是该动画之年改变位置和尺寸,无法改变颜色

2、使用xml方式

这种方式需要两份xml文件,将需要进行移动的控件放在两个布局中保持同样的id。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/constraint_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击暴富"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

frame_two.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/constraint_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题"
        android:layout_marginTop="100dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity

class MainActivity : AppCompatActivity() {
    var constraintLayout: ConstraintLayout ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        constraintLayout = findViewById(R.id.constraint_layout)
        lifecycleScope.launch {
            delay(1000)
            animateToKeyframeTwo()
    private fun animateToKeyframeTwo() {
        val constraintSet = ConstraintSet()
        constraintSet.load(this, R.layout.frame_two)
        TransitionManager.beginDelayedTransition(constraintLayout!!)
        constraintSet.applyTo(constraintLayout)

3、使用代码方式

如果觉得上述使用两个布局的方式不太好,也可以使用代码进行控制,不过代码会比较冗余

var constraintLayout: ConstraintLayout ?= null
 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        constraintLayout = findViewById(R.id.constraint_layout)
        lifecycleScope.launch {
            delay(1000)
            animateToKeyframeOne()
    private fun animateToKeyframeOne(){
        val constraintSet = ConstraintSet()
        constraintSet.clone(constraintLayout)
//        constraintSet.clear(R.id.title) //清除之前的约束
        constraintSet.centerHorizontally(R.id.title, ConstraintSet.PARENT_ID)
        //这个表示了R.id.title距离ConstraintSet.PARENT_ID 的顶部距离为100,后面的margin根据第二个参数来决定是距离那边的边距
        constraintSet.connect(R.id.title,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP, 100)
        TransitionManager.beginDelayedTransition(constraintLayout!!)
        constraintSet.applyTo(constraintLayout)

三、参考链接

  1. 使用 ConstraintLayout 构建自适应界面  |  Android 开发者  |  Android Developers | 关键帧动画

  2. [ConstraintSet](ConstraintSet  |  Android Developers)

  3. [Android ConstraintLayout ConstraintSet动态布局](Android ConstraintLayout ConstraintSet动态布局_赵彦军的博客-CSDN博客)

c = new ConstraintSet(); c.connect(....); //from a R.layout.* object c.clone(context, R.layout.layout1); //from a ConstraintLayout c.clone(clayout); <?xml version="1.0" encoding="utf-8"?> <androidx.con...
在传统布局方式中,如果要改变某个控件的位置,需要获取 LayoutParams , 后台修改属性值就行了。 但是在约束布局 ConstraintLayout 中,要改变控件的约束条件,需要用到 ConstraintSet 类。主要有 5 个步骤 第一步:创建 ConstraintSet() 实例 val set = ConstraintSet() 第二步:需要复制一份父布局的约束,方法有三个如下 set.clone(constraintLayout: ConstraintLayout);
1、相对定位:属性都形如 layout_constraint’DIRECTION’_to’TARGET DIRECTION’Of=”TARGET“ 1、constraint’DIRECTION’ 里的 ‘DIRECTION’代表是这个子控件自身的哪条边 2、to’TARGET DIRECTION’Of 里的 ‘TARGET DIRECTION’ 代表的是和约束控件的哪条边发生约束
I . ConstraintSet 约束集 简介 II . ConstraintSet 约束集中封装的约束属性及操作 示例 III . ConstraintSet 约束集 初始化方法 IV . ConstraintSet 约束集 应用到 约束布局 ConstraintLayout 中 V . ConstraintSet 关键帧动画 VI . ConstraintSet 关键帧动画 代码流程 VII . ConstraintSet 关键帧动画 支持的属性 VIII . ConstraintSet 关键帧动画
最近越来越喜欢使用约束布局ConstraintLayout了,今天突然想到可不可以通过代码改变约束条件,从而实现重新布局的效果呢?一查知道果然有这样的方法。 ​ 这里我们需要借助到ConstraintSet这个类来实现对布局的操作,一般步骤如下 构建一个ConstraintSet对象 ConstraintSet constraintSet = new ConstraintSet(); 将我们的约束布局克隆出来 constraintSet.clone(MainActivity.thi
MainActivity.class private ConstraintSet constraintSet1; private ConstraintSet constraintSet2; ConstraintLayout constraintLayout; boolean old = true; @Override prot...
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
使用ConstraintSet时,所有ConstraintLayout内的控件都必须有ID,记住,是所有的,动态生成ConstraintLayout子View的时候,出现了这个错误,一开始给动态添加的View设置ID:view,setId,还是报了这个错误,使用了ConstraintSet.clone(ConstraintLayout constraintLayout) 打开Constra...
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 31583 zh346807754: 编译的是SO 库,我用ffmpeg -h encoder=libx264 输出以下日志 ffmpeg -h encoder=libx264 built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.2) configuration: libavutil 58. 32.100 / 58. 32.100 libavcodec 60. 35.100 / 60. 35.100 libavformat 60. 18.100 / 60. 18.100 libavdevice 60. 4.100 / 60. 4.100 libavfilter 9. 14.100 / 9. 14.100 libswscale 7. 6.100 / 7. 6.100 libswresample 4. 13.100 / 4. 13.100 Codec 'libx264' is not recognized by FFmpeg. MAC环境编译Android环境下的FFmpeg6.0版本 Mr_Tony: 你是编译成.so了?如果是这样的话我也不清楚,如果只是看ffmpeg是否支持的话可以使用ffmpeg -h encoder=libx264