Android原生动效概述
一.補間動畫
?? ?包括alpha(透明度)、scale(伸縮)、translate(移動)、rotate(旋轉)四種,動畫的xml資源文件
?? ?alpha和scale統稱為Tween(漸變動畫),translate和rotate統稱為Frame(畫面轉變動畫)
?? ?一般都在res/anim目錄下,訪問時以R.anim.XXX.xml的方式
?? ?這四種動畫都繼承自Animation類,它們也繼承了它的公有屬性:
?? ??? ?android:duration 持續時長
?? ??? ?android:fillAfter 為true,則保持動畫結束時的狀態
?? ??? ?android:fillBefore 為true,則恢復動畫開始時的狀態
?? ??? ?android:fillEnable?? ?和fillBefore一樣
?? ??? ?android:repeatCount 重復次數
?? ??? ?android:repeatMode 重復類型,只有reverse和restart兩個值,reverse是倒序回放,restart是重放,這個屬性必須和repeatCount一起使用才有效
?? ??? ?android:interpolator 設置插值器
?? ??? ?eg:android:interpolator="@android:anim/accelerate_decelerate_interpolator"//android自帶有插值器
?? ?1.scale伸縮
?? ??? ?<?xml version="1.0" encoding="utf-8"?>
?? ??? ?<scale xmlns:android="http://schemas.android.com/apk/res/android" ? ?
?? ??? ??? ?android:fromXScale="0.0" ? ?
?? ??? ??? ?android:toXScale="1.4" ? ?
?? ??? ??? ?android:fromYScale="0.0" ? ?
?? ??? ??? ?android:toYScale="1.4" ? ?
?? ??? ??? ?android:pivotX="50" ? ?//縮放起點的X坐標
?? ??? ??? ?android:pivotY="50"?? ? ? //縮放起點的Y坐標
?? ??? ??? ?android:duration="700" />
?? ??? ??? ?另外關于pivot的取值:
?? ??? ??? ??? ?pivotX="50%" pivotY="50%"時表示在當前控件的中心處開啟縮放
?? ??? ??? ??? ?pivotX="50%p" pivotY="50%p"時表示在當前控件的父控件的中心處開啟縮放
?? ?2.alpha透明度
?? ??? ?<?xml version="1.0" encoding="utf-8"?>
?? ??? ?<alpha xmlns:android="http://schemas.android.com/apk/res/android" ? ?
?? ??? ??? ?android:fromAlpha="1.0" ? ?
?? ??? ??? ?android:toAlpha="0.1" ? ?
?? ??? ??? ?android:duration="3000" ? ?
?? ??? ??? ?android:fillBefore="true" />
?? ?3.rotate旋轉
?? ??? ?<?xml version="1.0" encoding="utf-8"?>
?? ??? ?<rotate xmlns:android="http://schemas.android.com/apk/res/android" ? ?
?? ??? ??? ?android:fromDegrees="0" ? ?
?? ??? ??? ?android:toDegrees="-650" ? ?
?? ??? ??? ?android:pivotX="50%" ? ?
?? ??? ??? ?android:pivotY="50%" ? ?
?? ??? ??? ?android:duration="3000" ? ?
?? ??? ??? ?android:fillAfter="true" />
?? ?4.translate平移
?? ??? ?<?xml version="1.0" encoding="utf-8"?>
?? ??? ?<translate xmlns:android="http://schemas.android.com/apk/res/android" ? ?
?? ??? ??? ?android:fromXDelta="0" ? ??
?? ??? ??? ?android:toXDelta="-80" ? ?
?? ??? ??? ?android:fromYDelta="0" ? ?
?? ??? ??? ?android:toYDelta="-80" ? ?
?? ??? ??? ?android:duration="2000" ? ?
?? ??? ??? ?android:fillBefore="true" />
?? ?5.四種動畫可以各自單獨使用,也可以組合使用:set標簽
?? ??? ?<?xml version="1.0" encoding="utf-8"?>
?? ??? ?<set xmlns:android="http://schemas.android.com/apk/res/android" ? ?
?? ??? ??? ?android:ordering=["together" | "sequentially"]> ? ?
?? ??? ??? ?<alpha ? ??
?? ??? ??? ??? ?android:fromAlpha="0.0" ? ?
?? ??? ??? ??? ?android:toAlpha="1.0"/> ? ?
?? ??? ??? ?<scale ? ?
?? ??? ??? ??? ?android:fromXScale="0.0" ? ?
?? ??? ??? ??? ?android:toXScale="1.4" ? ?
?? ??? ??? ??? ?android:fromYScale="0.0" ? ?
?? ??? ??? ??? ?android:toYScale="1.4" ? ?
?? ??? ??? ??? ?android:pivotX="50%" ? ?
?? ??? ??? ??? ?android:pivotY="50%"/> ? ?
?? ??? ??? ?<rotate ? ?
?? ??? ??? ??? ?android:fromDegrees="0" ??
?? ??? ??? ??? ?android:toDegrees="720" ??
?? ??? ??? ??? ?android:pivotX="50%" ? ?
?? ??? ??? ??? ?android:pivotY="50%"/> ? ? ??
?? ??? ?</set>
?? ?6.開啟動畫
?? ??? ?Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.XXX);
?? ??? ?控件對象.startAnimation(animation)
?? ?7.關于插值器
?? ??? ?android自帶的幾種插值器對一般的需求來說就已經夠用了,而且自定義一個插值器對數學要求賊高:
?? ??? ?LinearInterpolator 勻速
? ? ? ? AccelerateDecelerateInterpolator 先加速再減速
? ? ? ? AccelerateInterpolator 持續加速,瞬間停止
? ? ? ? DecelerateInterpolator 持續減速,動畫結束速度減為0
? ? ? ? AnticipateInterpolator 先回拉再進行正常的動畫軌跡,比如動畫是要控件勻速變大,使用這個插值器會使控件先變小再正常勻速變大,類似于一個蓄力的感覺
? ? ? ? OvershootInterpolator 它和上面一個插值器正好相反,比如控件勻速變大到指定大小,使用這個插值器就會使控件在變大到指定大小后繼續變大一點,然后再彈回指定大小
? ? ? ? AnticipateOvershootInterpolator 它是上面兩個插值器的結合體,不多說了
? ? ? ? BounceInterpolator 在目標值出彈跳,類似于乒乓球落地后來回起落的效果
? ? ? ? CycleInterpolator 它是一個正余弦曲線,但是他和AnticipateOvershootInterpolator的區別是:它可以自定義曲線的周期,所以動畫可以不到終點就結束,
?? ??? ?也可以到達終點后回彈,回彈的次數由曲線的周期決定,曲線的周期由 CycleInterpolator() 構造方法的參數決定
二.屬性動畫(Android補間動畫click事件還在原位怎么解決:就用屬性動畫)
其實Android的動畫可分為ViewAnimation和PropertyAnimation兩類,視圖動畫包括了幀動畫和補間動畫,屬性動畫包括了ValueAnimation和ObjectAnimation
?? ?1.ValueAnimator
?? ?簡單使用:
? ? tv就是一個普通的TextView對象,整個動畫就是在1s內讓tv從(0,0)移至(400,400)
?? ?關于插值器在第五點說補間動畫時列舉了系統提供這樣一堆插值器對象,基本上可以滿足我們的需求,
?? ?如果說一定要自定義自己的插值器的話,要去實現TimeInterpolator接口:
? ? 再來看估值器Evaluator,它是根據當前進度值來獲取動畫具體要改變的屬性值。比如上述代碼中進度如果為0.4的話那么tv的位置就是(160,160),但是上述代碼中我們沒有去調用animator.setEvaluator方法去設置估值器,因為它有默認的估值器:當調用的是OfInt方法時就會默認取IntEvaluator即animator.setEvaluator(new IntEvalutor()),同樣的調用ofFloat方法時會默認取FloatEvaluator這倆估值器的默認公式都是:當前實際值 = 起始值+(終值-起始值)*進度值
這是IntEvaluator的源碼:
public class IntEvaluator implements TypeEvaluator<Integer> {@overridepublic Integer evaluate(float fraction, Integer startValue, Integer endValue) {int startInt = startValue;return (int)(startInt + fraction * (endValue - startInt));} }? ?當然我們也可以去自定義估值器,但是自定義估值器更多是在調用ofObject方法時來自定義估值器,ofInt和ofFloat只能傳入整型和浮點型的參數,ofObject方法就為我們提供傳入其它類型參數的方式
?? ?
?? ?這個動畫的效果就是在十秒內加速的在tv中從A顯示到Z,具體的字符切換在估值器CharEvaluator中實現:
public class CharEvaluator implements TypeEvaluator<Character> {@Overridepublic Character evaluate(float fraction, Character startValue, Character endValue) {int startInt ?= (int)startValue;//將字符轉為ASCII碼,A是65int endInt = (int)endValue;int curInt = (int)(startInt + fraction *(endInt - startInt));char result = (char)curInt;return result;} }?? ?2.ObjectAnimator
?? ?上面說的ValueAnimator有個缺點就是它只能對數值進行動畫設置,如果我們想對某個控件的某個屬性進行動畫設置還需要在addUpdateListener監聽對象中用類似于tv.setText("...")這樣的方式來設置屬性值。ObjectAnimator就為我們提供了直接操作控件屬性動畫的方式,而且它派生自ValueAnimator,所以ValueAnimator中的方法在ObjectAnimator中都可以正常使用
?? ?簡單用法:
????2s內tv(TextView對象)的透明度從1降至0.2再恢復至1,"alpha"這個參數對應的是tv的setAlpha方法,判定當前控件對象是否有該屬性的依據就是該控件對象是否有該屬性的set方法(駝峰式命名),ofInt和ofFloat方法用法一樣,ofObject方法就加一個估值器參數即可:
ObjectAnimator animator = ObjectAnimator.ofObject(tv, "text", new CharEvaluator(), new Character('A'), new Character('Z'));???3.ValueAnimator和ObjectAnimator除了通過ofInt(),ofFloat(),ofObject()創建實例外,還都有一個ofPropertyValuesHolder()方法來創建實例
?? ?直接看使用實例:
? ?從代碼可以看出ofPropertyValuesHolder更多是對同一個控件上的動畫的組合時調用,直接用PropertyValuesHolder的ofInt、ofFloat、ofObject方法來創建單個動畫實例,注意這里的控件對象和控件屬性是分開的
?? ?PropertyValuesHolder還提供了ofKeyframe方法來替代估值器和插值器的作用,具體使用請看:
?? ?https://blog.csdn.net/harvic880925/article/details/50752838
?? ?4.不同控件動畫的組合:AnimatorSet?? ?
? ? 使用示例:
ObjectAnimator tv1BgAnimator = ObjectAnimator.ofInt(mTv1, "BackgroundColor", ?0xffff00ff, 0xffffff00, 0xffff00ff);ObjectAnimator tv1TranslateY = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0); tv1TranslateY.setStartDelay(2000); tv1TranslateY.setRepeatCount(ValueAnimator.INFINITE);ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0); tv2TranslateY.setStartDelay(2000);AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(tv1BgAnimator,tv1TranslateY,tv2TranslateY); animatorSet.playSequentially(tv1BgAnimator,tv1TranslateY,tv2TranslateY);//按順序執行 animatorSet.setDuration(2000); animatorSet.start();總結
以上是生活随笔為你收集整理的Android原生动效概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 163的邮箱不错
- 下一篇: Camtasia Studio 7使用说