日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓修改动画效果--动画差值器TimeInterpolator

發布時間:2025/3/21 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓修改动画效果--动画差值器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秒,但是需要在中間停留五秒

現在拆分需求

  • 調整寬度,并且設置layout_marginLeft為屏幕寬
  • 動畫改變:從右往中間1.5秒播完,然后中間等5秒,然后從中間往左1.5秒播完
  • 上手

    調整寬度,布局代碼,調整寬度

    <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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。