一、補間影片
補間影片的作用物件是View,支持四種影片效果,分別是平移,縮放,旋轉,透明度,補間影片既可以是單個影片,也可以有一系列影片組成,補間影片的四種分別對應Animation的四個子類(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation),除了以上四個子類它還有一個AnimationSet類,對應xml標簽為<set>,它是一個容器,可以包含若干個影片,并且內部也可以繼續嵌套<set>集合
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--平移影片標簽,數值、百分數、百分數p,例如50表示以當前View左上角坐標加50px為初始點、50%表
示以當前View的左上角加上當前View寬高的50%做為初始點、50%p表示以當前View的左上角加上父控制元件寬高
的50%做為初始點-->
<translate
android:duration="4000"
android:fromXDelta="0%p"
android:fromYDelta="0%p"
android:toXDelta="20%p"
android:toYDelta="20%p" />
<!--縮放影片標簽,其中pivotX為縮放起點X軸坐標-->
<scale
android:duration="4000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.2"
android:toYScale="0.2" />
<!--旋轉影片標簽,fromDegrees是旋轉開始角度,正代表順時針度數,負代表逆時針度數-->
<rotate
android:duration="4000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
<!--透明度影片標簽,fromAlpha為影片開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)-->
<alpha
android:duration="4000"
android:fromAlpha="1.0"
android:toAlpha="0.2" />
</set>
比如我們對TextView設定影片,使其點擊后執行影片
txt.setOnClickListener {
it.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animview))
}
| Animation類的方法 | 作用 |
|---|---|
| reset() | 重置Animation的初始化 |
| cancel() | 取消Animation影片 |
| start() | 開始Animation影片 |
| setAnimationListener() | 給當前Animation設定影片監聽 |
| hasStarted() | 判斷當前Animation是否開始 |
| hasEnded() | 判斷當前Animation是否結束 |
| clearAnimation() | 取消當View在執行的Animation影片 |
補間影片執行之后并未改變View的真實布局屬性值,例如我們在Activity中有一個Button在螢屏上方,我們設定了平移影片移動到螢屏下方然后保持影片最后執行狀態呆在螢屏下方,這時如果點擊螢屏下方影片執行之后的Button是沒有任何反應的,而點擊原來螢屏上方沒有Button的地方卻回應的是點擊Button的事件,在進行影片的時候,盡量使用dp,因為px會導致適配問題
插值器
插值器定義了影片的變化率,能幫助我們實作非線性改變的影片
| xml | 描述 |
|---|---|
| @android:anim/accelerate_decelerate_interpolator | 影片始末速率較慢,中間加速 |
| @android:anim/accelerate_interpolator | 影片開始速率較慢,之后慢慢加速 |
| @android:anim/bounce_interpolator | 影片結束時彈起 |
| @android:anim/decelerate_interpolator | 影片開始快然后慢 |
| @android:anim/overshoot_interpolator | 向前彈出一定值之后回到原來位置 |
幀影片
幀影片是順序播放一組預先定義好的圖片,不同于補間影片,系統提供了另外一個類AnimationDrawable來使用幀影片
在drawable檔案夾下創建xml檔案,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--oneshot為true代表只執行一次,false回圈執行-->
<item android:drawable="@drawable/text_bg" android:duration="180"/>
<item android:drawable="@drawable/text_bg2" android:duration="180"/>
<item android:drawable="@drawable/text_bg3" android:duration="180"/>
<item android:drawable="@drawable/text_bg4" android:duration="180"/>
</animation-list>
執行影片,如下所示:
txt.setBackgroundResource(R.drawable.anim_zhen)
txt.setOnClickListener {
val animationDrawable = it.background as AnimationDrawable
animationDrawable.start()
}
屬性影片
出現的原因
在屬性影片出現以前,Android主要有兩種影片,幀影片(Frame Animation)和補間影片(Tween Animation),這兩種影片統稱為視圖影片,幀影片是通過逐幀播放圖片來實作影片效果,補間影片雖然提供了旋轉、縮放、位移、透明度的影片效果,卻有不可忽視的三大缺陷:
(1)作用物件有限,只能作用于View及其子類
(2)影片種類有限,只有旋轉、縮放、位移、透明度4種影片
(3)只改變了View的顯示效果,沒有真正改變View的屬性,例如:對View作位移的補間影片后,View雖然顯示改變,但是回應區域卻還在原來的位置
原理
屬性影片通過在預設的規則下不斷地改變值,并將值設定給作用物件的屬性,從而達到影片效果,這個規則可以由我們定制,其中有兩個重要的工具,可以幫助我們定制值的變化規則,一個是插值器(Interpolator),一個是估值器(TypeEvaluator)
插值器定義了影片的變化率,能幫助我們實作非線性改變的影片,如加速變化的AccelerateInterpolator
估值器的作用是計算出影片對應的最終的屬性值,系統默認提供了3種估值器:
(1)IntEvaluator整型估值器,值的型別為整型
(2)FloatEvaluator浮點型估值器,值的型別為浮點型
(3)ArgbEvaluator,值的型別為ARGB值,可以用來計算顏色值
屬性影片的使用
屬性影片主要通過兩個類來使用,ValueAnimator和ObjectAnimator,這兩個的區別主要是:ValueAnimator只是計算值,賦值給物件屬性需要我們手動監聽值的變化來進行;ObjectAnimator則對賦值屬性這一步封裝進了內部,也就是自動賦值
ValueAnimator的使用
在res目錄里創建animator目錄,之后創建Animator resources file
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="30"
android:valueTo="200"
android:valueType="intType" />
ValueAnimator提供了回呼以監聽影片值,我們可以在此回呼中拿到屬性值并手動賦值給物件屬性,從而達到效果,需要注意的是,物件是View的時候,有時需要我們在賦值屬性后呼叫View.invalidate()或者View.requestLayout()方法來重繪界面實作視覺效果
val valueAnimator = AnimatorInflater.loadAnimator(this, R.animator.animator_hi) as ValueAnimator
//設定影片持續時間,以毫秒為單位
valueAnimator.duration = 2000
//設定插值器
valueAnimator.interpolator = DecelerateInterpolator()
//設定影片重復模式,RESTART表示影片正序重復,REVERSE代表倒序重復
valueAnimator.repeatMode = ValueAnimator.REVERSE
//設定重復次數,ValueAnimator.INFINITE表示無限重復
valueAnimator.repeatCount = 10
//設定影片延遲播放的時間
valueAnimator.startDelay = 1000
valueAnimator.addUpdateListener {
val value = it.animatedValue.toString()
txt.textSize = value.toFloat()
}
valueAnimator.start()
ObjectAnimator(ValueAnimator的子類)的使用
(1) ofInt(int… values):值的型別是int,會默認使用整形估值器
(2) ofFloat(float… values):值的型別是float,會默認使用浮點型估值器
(3) ofArgb(int… values):值的型別是代表顏色的32位的int,會默認使用ArgbEvaluator估值器
(4) ofObject(TypeEvaluator evaluator,Object… values):對應值的型別是Object,這種方式需要顯式傳入估值器,因為對于Object型別沒有系統提供的估值器
/*
引數解釋:
target:ObjectAnimator作用的物件
propertyName:屬性名
values:過渡值(開始值、結束值)
*/
val objectAnimator = ObjectAnimator.ofFloat(txt, "textSize", 10f, 100f)
objectAnimator.duration = 3000
objectAnimator.repeatCount = Animation.INFINITE
objectAnimator.repeatMode = ValueAnimator.REVERSE
objectAnimator.start()
組合影片AnimatorSet
AnimatorSet用于把很多影片按照一定順序組合起來播放,AnimatorSet采用了構造器模式來組合影片
val objectAnimator = ObjectAnimator.ofFloat(txt, "textSize", 10f, 100f)
val objectAnimator1 = ObjectAnimator.ofFloat(txt, "rotation", 0f, 360f)
objectAnimator.repeatCount = Animation.INFINITE
objectAnimator.repeatMode = ValueAnimator.REVERSE
objectAnimator1.repeatCount = Animation.INFINITE
objectAnimator1.repeatMode = ValueAnimator.REVERSE
val animatorSet = AnimatorSet()
animatorSet.duration = 3000
animatorSet.play(objectAnimator).with(objectAnimator1)
//將animator1和animator2一起播放
animatorSet.play(objectAnimator).with(objectAnimator1)
//將animator1插入animator2之后播放
animatorSet.play(objectAnimator).after(objectAnimator1)
//將animator1插入animator2之前播放
animatorSet.play(objectAnimator).before(objectAnimator1)
影片的監聽
objectAnimator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
}
})
objectAnimator.addPauseListener(object : AnimatorListenerAdapter() {
override fun onAnimationPause(animation: Animator?) {
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/1303.html
標籤:其他
