安卓修改动画效果--动画差值器TimeInterpolator
生活随笔
收集整理的這篇文章主要介紹了
安卓修改动画效果--动画差值器TimeInterpolator
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前一段時間讓實現一個類似彈幕的效果,從右到左飄過去,時間八秒,嗯,很好做,一個動畫就ok了
布局代碼:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"><include layout="@layout/title_activity" /><Buttonandroid:id="@+id/bt"android:text="浮動輪播"android:layout_width="@dimen/dp100"android:layout_marginLeft="-100dp"android:layout_height="@dimen/dp40"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="start"android:layout_marginTop="@dimen/dp100"android:id="@+id/btStart"/></LinearLayout>文件代碼:
val width = windowManager.defaultDisplay.width//獲取屏幕的寬 val dp100 = R.dimen.dp100.toDimen() btStart.setOnClickListener {//播放一個平移代碼bt.startAnimator(AnimatorUtil.translationX, 8000, width.toFloat() + dp100, 0F)//這個工具類放在最后面 }效果圖:
需求出現了
現在改了需求,需要把彈幕的視圖改成跟屏幕一樣寬,然后動畫時間還是8秒,但是需要在中間停留五秒
現在拆分需求
上手
調整寬度,布局代碼,調整寬度
<Buttonandroid:id="@+id/bt"android:text="浮動輪播"android:layout_width="match_parent"android:layout_height="@dimen/dp40"/>然后把layout_marginLeft設置為負的屏幕的寬度
val layoutParams = LinearLayout.LayoutParams(width, R.dimen.dp40.toDimen().toInt()) layoutParams.leftMargin = -width bt.layoutParams = layoutParams然后直接改動畫,把動畫拆成三步,第一步從右走到中間,第二部停留五秒,第三部從中間走到左邊
btStart.setOnClickListener {bt.startAnimator(AnimatorUtil.translationX, 1500, width.toFloat() * 2, width.toFloat()) {if (it == AnimatorUtil.END) {btStart.postDelayed({//從右往左進到中間動畫結束后,//在中間停五秒//然后再播從中間往左走到外面的動畫bt.startAnimator(AnimatorUtil.translationX, 1500, width.toFloat(), 0F)}, 5000)}}}效果圖:
優化
雖然上面的動畫確實做到了效果,但是安全性不高,并且嵌套也很深,能不能優化一下呢?
我們可以使用動畫差值器來進行優化,并且可以把上面實現的兩個動畫縮減到一個動畫,而且中間不用做定時操作,提升了安全性,也減少了嵌套
我們可以實現動畫差值器的接口(TimeInterpolator)來實現上面的效果,接口源碼:
public interface TimeInterpolator {float getInterpolation(float input); }該接口只有一個方法,輸入的是動畫執行的百分比,返回值也是動畫執行的百分比,所以可以重寫該方法來動態的調整進度實現變更的需求效果
代碼如下:
btStart.setOnClickListener {bt.startAnimator(AnimatorUtil.translationX, 8000, width.toFloat() * 2, 0F).setInterpolator {//添加一個動畫差值器,這個是kt風格的代碼,java也類似return@setInterpolator when {it <= 0.1875F -> //0.1875是1.5秒相對于8秒的比例值//因為需要在0.1875(18.75%)走完0.5(50%),所以需要做一下數學計算it / 0.1875F * 0.5Fit >= 0.8125F ->//0.8125?是6.5秒相對于8秒的比例值(it - 0.8125F) / 0.1875F * 0.5F + 0.5Felse -> 0.5F}}}效果和上面一樣,而且使用動畫差值器基本可以不修改原有動畫代碼,并且可以實現很多的效果,當然,取決于自身的數學水平..
附上動畫工具類的代碼:
import android.animation.Animator import android.animation.ObjectAnimator/*** creator: lt 2019/8/9--18:46 lt.dygzs@qq.com* effect : 屬性動畫工具類* warning:*//*** 動畫回調的狀態*/ typealias AnimatorState = Int/*** 動畫常用的屬性和狀態*/ object AnimatorUtil {/**開始動畫*/const val START: AnimatorState = 0/**動畫結束*/const val END: AnimatorState = 1/**取消了動畫*/const val CANCEL: AnimatorState = 2/**重復動畫*/const val REPEAT: AnimatorState = 3/**透明動畫*/const val alpha = "alpha"/**x軸旋轉*/const val rotationX = "rotationX"/**y軸旋轉*/const val rotationY = "rotationY"/**縮放x軸*/const val scaleX = "scaleX"/**縮放y軸*/const val scaleY = "scaleY"/**位移x軸*/const val translationX = "translationX"/**位移y軸*/const val translationY = "translationY" }/*** 開始一個屬性動畫*/ fun Any.startAnimator(funName: String,time: Long,vararg floats: Float,listener: ((AnimatorState) -> Unit)? = null): ObjectAnimator {val objectAnimator = ObjectAnimator.ofFloat(this, funName, *floats).setDuration(time)if (listener != null) {objectAnimator.addListener(object : Animator.AnimatorListener {override fun onAnimationRepeat(animation: Animator?) {listener.invoke(AnimatorUtil.REPEAT)}override fun onAnimationEnd(animation: Animator?) {listener.invoke(AnimatorUtil.END)}override fun onAnimationCancel(animation: Animator?) {listener.invoke(AnimatorUtil.CANCEL)}override fun onAnimationStart(animation: Animator?) {listener.invoke(AnimatorUtil.START)}})}objectAnimator.start()return objectAnimator }?
動畫估值器:TypeEvaluator,使用:
anim.setEvaluator(ArgbEvaluator())
總結
以上是生活随笔為你收集整理的安卓修改动画效果--动画差值器TimeInterpolator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构特性解析 (一) 数组
- 下一篇: 超级封装RecyclerView的适配器