1.动画的实现原理与限制
原理:将新的布局结构结构设置到当前本布局中。
限制:只能是位置
或者尺寸
的变化。
2.动画实例
2.1.创建两个内容完全相同的布局文件,将一个设置为当前活动的布局然后对另外一个布局的视图进行位置或者尺寸上的修改。
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/constraintlayout"
>
<ImageView
android:id="@+id/PostCard"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="100dp"
android:layout_marginLeft="100dp"
android:layout_marginEnd="100dp"
android:layout_marginRight="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.53"
app:srcCompat="@mipmap/postcard" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Action"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/PostCard"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/constraintlayout"
>
<ImageView
android:id="@+id/PostCard"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.53"
app:srcCompat="@mipmap/postcard" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Action"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/PostCard"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.2.在代码中添加切换逻辑
class MainActivity : AppCompatActivity() {
//是否是初始布局结构
var changed=false
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_firstframe)
//绑定按钮
val actionButton=findViewById<Button>(R.id.button)
//用于获得其他布局配置的对象
val constraintSet=ConstraintSet()
//为按钮添加监听
actionButton.setOnClickListener(View.OnClickListener {
if(!changed){
//是初始布局时,获取效果帧的布局配置
constraintSet.load(this,R.layout.activity_secondframe)
}else{
//是动画效果帧时,获得原始布局配置
constraintSet.load(this,R.layout.activity_firstframe)
}
//添加延缓转换效果,不设置时将立即切换没有渐变动画效果
//constraintlayout,是最外层Constraintlayout的id
TransitionManager.beginDelayedTransition(constraintlayout)
//应用布局设置
constraintSet.applyTo(constraintlayout)
//修改当前布局状态标志
changed=!changed
})
}
}
2.3 动画效果