學(xué)習(xí)筆記儡蔓,僅供自己參考郭蕉,如有不對歡迎指正
android中的動畫
(圖片使用來自網(wǎng)絡(luò),對圖片作者便是感謝喂江,如有任何問題召锈,通知會刪除)
Android 動畫可以歸納為以下幾種:
-
補間動畫(View 動畫)
使用場景:
1.可以來做過度動畫比如popwindow的顯示隱藏
2.activity的進入退出
3.ViewGroup的進場動畫
android:layoutAnimation="@anim/anim_layout",anim_layout 就是 ViewGroup 中子控件在第一次顯示時的進場動畫效果获询。 -
幀動畫
沒什么可說的 屬性動畫
1. ValueAnimator:
只需要提供初始值和結(jié)束值涨岁,ValueAnimator會自動平滑的從完成起止的動畫效果拐袜。內(nèi)部使用一種時間循環(huán)的機制來計算值與值之間的動畫過渡
2. ObjectAnimator:
繼承自ValueAnimator,底層的動畫實現(xiàn)機制基于ValueAnimator梢薪。相對于ValueAnimator只能對view進行平滑的動畫過度蹬铺,ObjectAnimator可以對任意對象的任意屬性進行動畫操作,如View的alpha屬性秉撇。
val animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f)
animator.duration = 5000
animator.start()
3. Interpolator:控制動畫的變化速率
4. ViewPropertyAnimator:對View使用動畫提供的一種便捷機制
比如我們相對一個view執(zhí)行復(fù)雜的動畫集合甜攀,就可以如下調(diào)用
textview.animate().x(500).y(500).setDuration(5000)
.setInterpolator(new BounceInterpolator());
不使用ViewPropertyAnimator,則需要自己去創(chuàng)建ObjectAnimator去實現(xiàn)
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 0f);
animator.start();
觸摸反饋動畫(Ripple Effect)
觸摸時間會叫哥onTouchEvent來處理琐馆。膜拜大神:https://hencoder.com/ui-3-1/
自定義觸摸反饋的關(guān)鍵:
1.重寫 onTouchEvent()规阀,在里面寫上你的觸摸反饋算法,并返回 true(關(guān)鍵是 ACTION_DOWN 事件時返回 true)瘦麸。
2.如果是會發(fā)生觸摸沖突的 ViewGroup谁撼,還需要重寫 onInterceptTouchEvent(),在事件流開始時返回 false瞎暑,并在確認(rèn)接管事件流時返回一次 true,以實現(xiàn)對事件的攔截与帆。
3.當(dāng)子 View 臨時需要阻止父 View 攔截事件流時了赌,可以調(diào)用父 View 的 requestDisallowInterceptTouchEvent() ,通知父 View 在當(dāng)前事件流中不再嘗試通過 onInterceptTouchEvent() 來攔截玄糟。-
揭露動畫(Reveal Effect)
使用場景:activity切換的 和 view顯示隱藏 -
轉(zhuǎn)場動畫 & 共享元素
轉(zhuǎn)場動畫主要用在activity切換時
共享元素主要在兩個切換的頁面有共同的元素勿她,重點兩個:
1)transitionName
是關(guān)鍵屬性
2)延遲動畫postponeEnterTransition()
結(jié)束頁面調(diào)用supportFinishAfterTransition()
-
視圖狀態(tài)動畫(Animate View State Changes)
比如被點擊、選中等時候的動畫 -
矢量圖動畫(Vector 動畫)
關(guān)于矢量圖可以參考:http://www.reibang.com/p/977147b8f3eb?utm_campaign
1.矢量圖的優(yōu)缺點
優(yōu)點:
1.完美的適配性
2.體積更小
3.放大縮小阵翎,不失真
缺點:
1.5.0以下不支持
2.不支持硬件加速,過于復(fù)雜的圖片加載效率低逢并,不建議
2.矢量圖使用 drawable > 右鍵 > new > Vector Asset-local file(設(shè)計師給的圖)
矢量圖在布局文件中使用
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
app:srcCompat="@drawable/ic_clear_black_24dp"
/>
3.矢量動畫分為三種:
1.屬性變換,與補間動畫一樣
2.路徑繪制
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:interpolator="@android:interpolator/linear"
android:propertyName="trimPathEnd"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
3.路徑變換
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:propertyName="pathData"
android:valueFrom="@string/path_begin"
android:valueTo="@string/path_end"
android:valueType="pathType"
android:interpolator="@android:anim/accelerate_interpolator"/>
- 約束布局實現(xiàn)的關(guān)鍵幀動畫(ConstraintSet 動畫)
關(guān)鍵:指定動畫指定開頭和結(jié)尾的兩個關(guān)鍵幀
比如改變一個view的大小郭卫、間距砍聊、透明度等等。會真正改變view的狀態(tài)贰军,比如將view長度變?yōu)?玻蝌,它原來的位置點擊將無效。示例代碼
private var mConstraintSet2: ConstraintSet? = null
private var mConstraintSet1: ConstraintSet? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val mConstraintLayout = findViewById<ConstraintLayout>(R.id.mConstraintLayout)
mConstraintSet2 = ConstraintSet()
mConstraintSet1 = ConstraintSet()
mConstraintSet2?.clone(mConstraintLayout)
mConstraintSet1?.clone(mConstraintLayout)
findViewById<Button>(R.id.jumpBt).setOnClickListener {
TransitionManager.beginDelayedTransition(mConstraintLayout);
mConstraintSet2?.constrainWidth(R.id.tv02,0)
mConstraintSet2?.applyTo(mConstraintLayout)
}
findViewById<Button>(R.id.jumpBt2).setOnClickListener {
TransitionManager.beginDelayedTransition(mConstraintLayout);
mConstraintSet1?.applyTo(mConstraintLayout);
}
}