學習筆記,僅供自己參考,如有不對歡迎指正
android中的動畫
(圖片使用來自網絡,對圖片作者便是感謝,如有任何問題,通知會刪除)
Android 動畫可以歸納為以下幾種:
-
補間動畫(View 動畫)
使用場景:
1.可以來做過度動畫比如popwindow的顯示隱藏
2.activity的進入退出
3.ViewGroup的進場動畫
android:layoutAnimation="@anim/anim_layout",anim_layout 就是 ViewGroup 中子控件在第一次顯示時的進場動畫效果。 -
幀動畫
沒什么可說的 屬性動畫
1. ValueAnimator:
只需要提供初始值和結束值,ValueAnimator會自動平滑的從完成起止的動畫效果。內部使用一種時間循環的機制來計算值與值之間的動畫過渡
2. ObjectAnimator:
繼承自ValueAnimator,底層的動畫實現機制基于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執行復雜的動畫集合,就可以如下調用
textview.animate().x(500).y(500).setDuration(5000)
.setInterpolator(new BounceInterpolator());
不使用ViewPropertyAnimator,則需要自己去創建ObjectAnimator去實現
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 0f);
animator.start();
觸摸反饋動畫(Ripple Effect)
觸摸時間會叫哥onTouchEvent來處理。膜拜大神:https://hencoder.com/ui-3-1/
自定義觸摸反饋的關鍵:
1.重寫 onTouchEvent(),在里面寫上你的觸摸反饋算法,并返回 true(關鍵是 ACTION_DOWN 事件時返回 true)。
2.如果是會發生觸摸沖突的 ViewGroup,還需要重寫 onInterceptTouchEvent(),在事件流開始時返回 false,并在確認接管事件流時返回一次 true,以實現對事件的攔截。
3.當子 View 臨時需要阻止父 View 攔截事件流時,可以調用父 View 的 requestDisallowInterceptTouchEvent() ,通知父 View 在當前事件流中不再嘗試通過 onInterceptTouchEvent() 來攔截。-
揭露動畫(Reveal Effect)
使用場景:activity切換的 和 view顯示隱藏imageimage -
轉場動畫 & 共享元素
轉場動畫主要用在activity切換時
共享元素主要在兩個切換的頁面有共同的元素,重點兩個:
1)transitionName
是關鍵屬性
2)延遲動畫postponeEnterTransition()
結束頁面調用supportFinishAfterTransition()
image -
視圖狀態動畫(Animate View State Changes)
比如被點擊、選中等時候的動畫image -
矢量圖動畫(Vector 動畫)
關于矢量圖可以參考:http://www.lxweimin.com/p/977147b8f3eb?utm_campaign
1.矢量圖的優缺點
優點:
1.完美的適配性
2.體積更小
3.放大縮小,不失真
缺點:
1.5.0以下不支持
2.不支持硬件加速,過于復雜的圖片加載效率低,不建議
2.矢量圖使用 drawable > 右鍵 > new > Vector Asset-local file(設計師給的圖)imageimage
矢量圖在布局文件中使用
<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"/>
- 約束布局實現的關鍵幀動畫(ConstraintSet 動畫)
關鍵:指定動畫指定開頭和結尾的兩個關鍵幀
比如改變一個view的大小、間距、透明度等等。會真正改變view的狀態,比如將view長度變為0,它原來的位置點擊將無效。示例代碼
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);
}
}