当个View下,使用Drawable入场退场动画

效果图,简单的入场退场动效,一般情况是不同view之间去添加动画,某些条件下显然并不符合需求,需要在单个ImageView下进行的

<?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"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/white">
 <ImageView
 android:id="@+id/iv_bg"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:scaleType="fitXY"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toTopOf="parent" />
 <Button
 android:id="@+id/btn_click"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_margin="100dp"
 android:text="点击切换背景"
 android:textSize="30sp"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

该view下,背景存在不同资源,png,drawable,svg,color,本质其实都是drawable

drawable下使用入场退场动效,需要使用到 TransitionDrawable,utils类如下

object TransitionDrawableUtils {
 private var topDrawable: Drawable? = null
 fun setDrawable(bgView: ImageView, drawable: Drawable) {
 if (topDrawable == null) {
 bgView.setImageDrawable(drawable)
 } else {
 val drawables = arrayListOf<Drawable>()
 topDrawable?.let { drawables.add(it) }
 drawables.add(drawable)
 val transition = TransitionDrawable(drawables.toTypedArray())
 bgView.setImageDrawable(transition)
 transition.startTransition(1000)
 }
 topDrawable = drawable
 }
}

要使用TransitionDrawable至少需要两个drawable资源,然后定义drawableList,进行背景切换,切换时TransitionDrawable会对资源进行过渡

package com.example.page
import android.annotation.SuppressLint
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable
class TransitionDrawableActivity : AppCompatActivity() {
 private var index = 0
 @SuppressLint("UseCompatLoadingForDrawables")
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_transition)
 val ivBg = findViewById<ImageView>(R.id.iv_bg)
 val btnClick = findViewById<Button>(R.id.btn_click)
 val bgList = arrayListOf<Drawable>(
 ColorDrawable(Color.CYAN),
 resources.getDrawable(R.drawable.bg_def, this.theme),
 toTransitionDrawable(resources.getDrawable(R.drawable.bg1, this.theme)),// svg图片需要转换一下
 toTransitionDrawable(resources.getDrawable(R.drawable.bg2, this.theme)),
 toTransitionDrawable(resources.getDrawable(R.drawable.bg3, this.theme)),
 toTransitionDrawable(resources.getDrawable(R.drawable.bg4, this.theme))
 )
 TransitionDrawableUtils.setDrawable(ivBg, bgList[index])
 btnClick.setOnClickListener {
 index++
 if (index >= bgList.size) {
 index = 0
 }
 TransitionDrawableUtils.setDrawable(ivBg, bgList[index])
 }
 }
 private fun toTransitionDrawable(drawable: Drawable): Drawable {
 return drawable.toBitmap(1920, 1920, null).toDrawable(resources)
 }
}  

需要注意的是,如果是svg图片,需要转换一下,否则svg不支持TransitionDrawable

简单,且实用

作者:翻滚的咸鱼原文地址:https://www.cnblogs.com/LiuZhen/p/18165232

%s 个评论

要回复文章请先登录注册