當前位置:首頁 » 安卓系統 » android動畫原理

android動畫原理

發布時間: 2022-12-24 14:40:59

⑴ Android常見動畫效果合集,讓APP熠熠生輝,絢麗靈動

在App中添加一些動畫效果,會給用戶耳目一新,眼前一亮的感覺,讓APP顯的高端大氣上檔次,因此開發項目的過程中能夠實現一些常見的動畫效果還是很有必要的,Android本身提供了豐富的動畫API,方便我們實現炫酷的動畫效果。

先放上幾張實現的效果圖:

一幀一幀進行播放,它的原理與Gif類似,按序播放一組預先定義好的圖片序列,如:

直接更改View 的屬性來實現的動畫。
工作原理:在一定時間間隔內,通過不斷調用set方法對值進行改變,並不斷將該值賦給對象的屬性,從而實現該對象在該屬性上的動畫效果

Google在Android 5.0之後推出的一種動畫效果,就是以某種方式從一個場景以動畫的形式過渡到另一個場景,可以參考 Material-Animations ,常用於點擊列表頁中的圖片跳轉到大圖或由列表頁跳轉到詳情頁

Lottie 是 Airbnb推出的一套跨平台的動畫完整解決方案,它能夠幫助開發者直接載入json格式的文件在 iOS、Android 和 React Native之上,實現 100% 與設計稿相同的動畫效果,而無需關心中間的實現細節。設計師只需要使用 After Effectes 設計出動畫之後,通過使用 Lottie 提供的Bodymovin插件將設計好的動畫導出成json格式的文件交付給開發即可完成。 Lottie網站 lottie-android

跨平台的即時通信軟體Telegram推出的新的Sticker貼紙格式,這個全新的 Sticker 貼紙格式為 .tgs,其實就是基於Lottie json文件改造而來的一種格式

GIF(Graphics Interchange Format)是由CompuServe公司開發的一種圖像文件格式,可以將多幅圖像保存到一個圖像文件,展示的時候將多幅圖像數據逐幀讀出並顯示到屏幕上,從而形成動畫效果。在Android中播放GIF通常有以下幾種方式:

https://github.com/kongpf8848/Animation

animlogoview

Telegram

⑵ Android 動畫詳解

  android中酷炫的效果,都離不開動畫的支持。這里我們詳細介紹一下android中動畫的分類。android的中動畫分為幀動畫、補間動畫、屬性動畫。原理各不相同,實現的效果也大不相同。下面一一講解三種動畫。

  幀動畫顧名思義就是通過順序一幀一幀播放圖片從而產生動畫效果,效果類似放電影。該動畫缺點比較明顯,就是如果圖片過大過多會導致OOM。幀動畫xml文件放置在drawable目錄下而非anim文件夾下。

  補間動畫是通過對view進行旋轉、縮放、漸變、透明度變化,而達到的一種動畫效果。是一種漸進式動畫。並且可以通過組合以上四種操作,完成復雜的自定義動畫效果。缺點就是只是改變的view的展示狀態,但是不會改變view的位置。例如我們將一個button通過位移想左移動100dp,然後停留在終點。但是我們可以發現展示的位置button點擊無效果,不可以交互。而在button原始位置空白的地方點擊會觸發button的點擊效果。也就是button本質還是在原來位置,只是展示左移了100dp。

透明度動畫,通過改變view的透明度展示動畫。對應AlphaAnimation和<alpha>xml標簽

縮放動畫,通過修改view的大小展示動畫。對應ScaleAnimation類和<scale>xml表情

通過旋轉view展示動畫。對應RotateAnimation類和<rotate>xml標簽

平移動畫,更改view的展示位置展示動畫。對應TranslateAnimation類和<translate>xml表情

應用動畫xml配置

使用java類配置動畫,具體參數類同xml參數,建議使用xml配置動畫

  屬性動畫本質是通過改變對象的屬性(例如:x,y等屬性),來實現動畫的,所以基本上是無所不能的,只要對象有這個屬性,就能實現動畫效果。屬性動畫是在api11的新特性,通過動態的改變view的屬性從而達到動畫效果。雖然可以使用nineoldandroid庫向下兼容,但是兼容本質是使用補間動畫完成,也就是說不會更改view的屬性,也不會更改view的位置。屬性動畫比較常用的類: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子類,而AnminationSet是動畫集合

動畫配置同樣可以使用xml配置,參數類似,這里不做詳細說明。

根據時間流逝百分比計算當前屬性改變百分比。同xml配置動畫中的 android:interpolator 屬性配置,常見有LinearInterpolator(線性差值器)、(加速減速差值器)
等。自定義需要實現 Interpolator 或者 TimeInterpolator 。Interpolator介面繼承TimeInterpolator。

根據當前屬性改變百分比計算改變後的屬性值。屬性動畫特有的屬性。自定義估值器需要實現 TypeEvaluator 介面。

可以對任意屬性做屬性動畫,屬性動畫要求動畫作用的對象提供該屬性的get()和set()方法。因為屬性動畫本質就是根據外界傳遞的對象屬性的初始值和終點值,然後根據估值器和差值器計算屬性值,不斷調用屬性的set方法,通過時間的推移所傳遞的值,越來越近終點值。
注意:

使用ValueAnimator通過監聽動畫過程,自己改變對象屬性完成動畫

⑶ ios和安卓的動畫原理是什麼

1:首先說動畫效果,所謂的動畫效果就是一個屬性(屬性組)的數值隨時間從一個值變化到另一個值得過程。Android 目前提供了兩個機制來實現動畫: 一種是比較古老的 Animation 機制,對應的也是 Animation 類和它的子類,但是這些類並不負責調度動畫。什麼意思呢,動畫的運行需要讓數值隨著時間變化,怎麼隨時間變化?通常來說我們需要一個 Timer,但是 Animation 機制沒有使用所謂的 Timer,而採用了自刷新的方式,所謂自刷新就是當一幀繪制完的時候馬上再計劃繪制下一幀,直到動畫到達終點。具體的邏輯在View#draw(Canvas canvas, ViewGroup parent,long drawingTime) 這個方法中Animation 類及子類的作用就是根據一個時間,計算出對應的屬性值,然後設置到 View 上。 2:於 alpha、transform 之類的屬性是如何實現的,這個說簡單也不簡單,說復雜也不復雜,實際上很多 2D 圖形渲染庫都能很輕易實現這些。只不過 Android 5.0 之後引入 RenderNode 的機制,每個單一的 View 實際都是 RenderNode-backing 的一層皮,實際的渲染內容是包含在等高級特性。Canvas 在 Android 5.0 之後直接向 DisplayList 中繪制,也就是記錄下來繪制指令,然後將這些一並送到渲染服務中進行合成,以 View 為單位的 alpha、transform 可以得到硬體加速(OpenGL、Vulkan)的支持,而面向 Bitmap(或舊版本 Android 的 View)的 Canvas 繪制有透明度的東西就是純 CPU 計算了,由 Skia 庫實現演算法

⑷ Android如何將逐幀動畫加在界面上

動畫的使用 是 Android 開發中常用的知識
可是動畫的 種類繁多、使用復雜 ,每當需要 採用自定義動畫 實現 復雜的動畫效果 時,很多開發者就顯得束手無策
本文將詳細介紹 Android 動畫中 逐幀動畫 的原理 & 使用
#1. 作用對象 視圖控制項( View )
1. 如 Android 的 TextView、Button 等等
2. 不可作用於 View 組件的屬性,如:顏色、背景、長度等等
#2. 原理
將動畫拆分為 幀 的形式,且定義每一幀 = 每一張圖片
逐幀動畫的本質:按序播放一組預先定義好的圖片
#3. 具體使用 ####步驟1:將動畫資源(即每張圖片資源)放到 drawable 文件夾里
技巧:
1. 找到自己需要的gif動畫
2. 用 gif 分解軟體(如 GifSplitter )將 gif 分解成一張張圖片即可

⑸ Android 中的動畫有哪幾類,它們的特點和區別是什麼

Android3.0(即API Level11)前Android僅支持2種畫:別Frame Animation(逐幀畫)Tween Animation(補間畫)3.0Android支持種新畫系統稱:Property Animation(屬性畫)

、Frame Animation:(逐幀畫)

理解幀幀播放圖片利用眼視覺殘留原理給我帶畫覺原理GIF圖片、電影播放原理

1.定義逐幀畫比較簡單要使用元素定義所播放幀即

(1) android:oneshot 設置否僅播放

(2) android:drawable 設置每幀圖片

(3) android:ration 設置圖片間切換間隔

2.習慣AnimationDrawable設置ImageView背景

android:background=@anim/frame_anim

我java代碼獲取AnimationDrawable象

AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();

(需要注意AnimationDrawable默認播放調用其start()始播放stop停止播放)

3.面畫文件通xml文件配置喜歡通java代碼創建AnimationDrawable象通addFrame(Drawable frame, int ration)向畫添加幀start()

二、Tween Animation:(補間畫)

補間畫我需指定始、結束關鍵幀變化其幀由系統計算必自幀幀定義

1. Android使用Animation代表抽象畫包括四種類:AlphaAnimation(透明度畫)、ScaleAnimation(縮放畫)、TranslateAnimation(位移畫)、RotateAnimation(透明度畫)Android面允許java創建Animation類象般都採用畫資源文件定義畫界面與邏輯離

(set同定義畫起執行)

2. android:interpolator=@android:anim/linear_interpolator控制畫期間需要補入少幀簡單說控制畫速度些翻譯插值Interpolator幾種實現類:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator具體使用參考官API Demo

3. 定義anim文件我通AnimationUtils工具類載入載入功返Animation通ViewstartAnimation(anim)始執行畫

Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//設置畫結束保留結束狀態
anim.setFillAfter(true);
//設置插值效
anim.setInterpolator(interpolator);
//view執行畫
view. startAnimation(anim);

三、Property Animation:(屬性畫)

屬性畫Android 3.0才引進直接更改我象屬性面提Tween Animation更改View繪畫效View真實屬性改變假設用Tween畫Button左邊移右邊論點擊移Button都沒反應點擊移前Button位置才反應Button位置屬性木改變Property Animation則直接改變View象屬性值讓我少做些處理工作提高效率與代碼讀性

(1)ValueAnimator:包含Property Animation畫所核功能畫間始、結束屬性值相應間屬性值計算等應用ValueAnimator兩步驟

1計算屬性值

2根據屬性值執行相應作改變象某屬性

我主第二步需要實現ValueAnimator.onUpdateListener介面介面函數onAnimationUpdate()要改變View象屬性事情該介面do

animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});

(2)ObjectAnimator:繼承自ValueAnimator要指定象及該象屬性屬性值計算完自設置該象相應屬性即完Property Animation全部兩步操作實際應用般都用ObjectAnimator改變某象某屬性用ObjectAnimator定限制要想使用ObjectAnimator應該滿足條件:

1.象應該setter函數:set(駝峰命名)

2面例像ofFloat類工場第參數象名第二屬性名面參數變參數values…參數設置值假定目值屬性值變化范圍前值目值獲前值該象要相應屬性getter:get

3getter其應返值類型應與相應setter參數類型致

ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();

滿足面條件我能乖乖使用ValueAnimator創建畫

(3)Animator.AnimatorListener:Animator設置畫監聽需要重寫面四

onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()

我實現AnimatorListenerAdapter處用定義想監聽事件用實現每函數卻定義空函數體:

anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});

(4)AnimationSet:組合畫共同工作

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();

面代碼意思: 首先播放anim1;同播放anim2,anim3,anim4;播放anim5

(5)TimeInterplator:與Tweeninterpolator類似幾種

AccelerateInterpolator 加速始慢間加速

DecelerateInterpolator 減速始快減速

先加速減速始結束慢間加速

AnticipateInterpolator 反向 先向相反向改變段再加速播放

反向加彈先向相反向改變再加速播放超目值緩慢移至目值

BounceInterpolator 跳躍快目值值跳躍目值100面值能依8577708090100

CycleIinterpolator 循環畫循環定數值改變弦函數:Math.sin(2 * mCycles * Math.PI * input)

LinearInterpolator 線性線性均勻改變

OvershottInterpolator 彈超目值緩慢改變目值

TimeInterpolator 介面允許自定義interpolator幾都實現介面

(6)Keyframes:讓我定義除始結束外關鍵幀KeyFrame抽象類要通ofInt(),ofFloat(),ofObject()獲適KeyFrame通PropertyValuesHolder.ofKeyframe獲PropertyValuesHolder象:

Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
述代碼意思:設置btn象width屬性值使其:始 Width=400畫始1/4 Width=200畫始1/2 Width=400畫始3/4 Width=100畫結束 Width=500

(7)ViewPropertyAnimator:View同改變種屬性非推薦用種該類屬性畫進行優化合並些invalidate()減少刷新視圖且使用起非簡便要求API LEVEL 12即Android 3.1僅需要行代碼即完水平、豎直移

myView.animate().translationX(50f). translationY(100f);

(8)需要改變些屬性:

translationX,translationY: View相於原始位置偏移量

rotation,rotationX,rotationY: 旋轉rotation用於2D旋轉角度3D用兩

scaleX,scaleY: 縮放比

x,y: View終坐標Viewlefttop位置加translationXtranslationY

alpha: 透明度

四、自總結三種畫優缺點:

(1)Frame Animation(幀畫)主要用於播放幀幀准備圖片類似GIF圖片優點使用簡單便、缺點需要事先准備每幀圖片;

(2)Tween Animation(補間畫)僅需定義始與結束關鍵幀變化間幀由系統補優點用准備每幀缺點改變象繪制沒改變View本身屬性改變按鈕位置需要點擊原按鈕所位置才效

(3)Property Animation(屬性畫)3.0推畫優點使用簡單、降低實現復雜度、直接更改象屬性、幾乎適用於任何象僅非View類缺點需要3.0API支持限制較目前外源庫提供低版本支持

⑹ Android WMS動畫系統初探(一)

Android WMS動畫系統初探(一)

Android WMS動畫系統初探(二)

Android WMS動畫系統初探(三)

Android中動畫的工作過程:在某一個時間點,調用getTransformation(),根據mStartTime和mDuration,計算出當前的進度,在根據mInterpolator計算出轉換的進度,然後計算出屬性的當前值,保存在matrix中。
再調用Matrix.getValues將屬性值取出,運用在動畫目標上。

[圖片上傳失敗...(image-8c5ae5-1636101404926)]

Animation
在給定了初始狀態、結束狀態、啟動時間與持續時間後,可以為使用者計算其動畫目標在任意時刻的變換(Transformation)

Transformation
描述了一個變換,包含兩個分量:透明度和一個二維變換矩陣

無論APP或者系統,都是可以直接向Choreographer注冊FrameCallback來實現動畫驅動的。

Choreographer 類似 Handler,處理回調的時機為屏幕的垂直同步(VSync)事件到來之時,其處理回調的過程被當作渲染下一幀的工作的一部分

postCallback(int callbackType, Runnable action, Object token)

postCallbackDelayed(int callbackType, Runnable action, Object token, delayMillis)

postFrameCallback(FrameCallback callback)

對於View動畫,動畫的目標就是View,而對於窗口來說,動畫的目標其實都是Surface,對 不同層級的SurfaceControl 進行操縱,會產生不同的動畫效果。

[圖片上傳失敗...(image-b25ef9-1636101404926)]

如上圖 WMS的結構層次可以簡單概括為:

RootWindowContainer -> DisplayContent -> DisplayArea -> Task -> WindowToken -> WindowState

[圖片上傳失敗...(image-2bdd8a-1636101404926)]

根據操縱層級的不同我把動畫分類為:窗口動畫、過渡動畫、Task動畫、全屏動畫等等

[圖片上傳失敗...(image-d5ed20-1636101404926)]

在窗口布局(relayout)階段調用到

WindowStateAnimator#commitFinishDrawingLocked ->

WindowState#performShowLocked ->

WindowStateAnimator#applyEnterAnimationLocked

開啟窗口動畫流程

frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java中定義了一個mSurfaceAnimator成員變數

SurfaceAnimator的startAnimation方法中創建Leash,可以通過SurfaceAnimator的類注釋了解 Leash

為什麼引入Leash可以參考此文: Android P——LockFreeAnimation

mAnimation.startAnimation這一步最終會通過LocalAnimationAdapter找到WMS里的SurfaceAnimationRunner進行執行。

這是 WindowContainer與SurfaceAnimtor、SurfaceAnimationRunner的持有關系 :

[圖片上傳失敗...(image-f741c0-1636101404926)]

往編舞者上拋的runnable是執行startAnimations方法

SurfaceAnimationRunner#startAnimations ->
SurfaceAnimationRunner#startPendingAnimationsLocked
會從mPendingAnimations遍歷RunningAnimation並執行startAnimationLocked

這一步構建了一個SfValueAnimator來真正的驅動動畫,每一幀的處理是通過WindowAnimationSpec構建真正要執行的動畫事務,然後使用mChoreographer.postCallback在下一個vsync信號到來時提交動畫事務。
ValueAnimator驅動動畫的原理本文就不做深入了。

下一篇文章我將進一步分析Activiy的過渡動畫和屏幕旋轉動畫的相關流程。

Android WMS動畫系統初探(二)

Android WMS動畫系統初探(三)

⑺ android中的動畫有哪幾類

在Android3.0(即API Level11)以前,Android僅支持2種動畫:分別是Frame Animation(逐幀動畫)和Tween Animation(補間動畫),在3.0之後Android支持了一種新的動畫系統,稱為:Property Animation(屬性動畫)。

一、Frame Animation:(逐幀動畫)

這個很好理解,一幀幀的播放圖片,利用人眼視覺殘留原理,給我們帶來動畫的感覺。它的原理的GIF圖片、電影播放原理一樣。

1.定義逐幀動畫比較簡單,只要在中使用子元素定義所有播放幀即可。

(1) android:oneshot 設置是否僅播放一次

(2) android:drawable 設置每一幀圖片

(3) android:ration 設置圖片間切換間隔

2.習慣上把AnimationDrawable設置為ImageView的背景

android:background=@anim/frame_anim

然後我們就可以在java代碼中獲取AnimationDrawable對象了

AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();

(需要注意的是,AnimationDrawable默認是不播放的,調用其start()方法開始播放,stop停止播放)

3.上面的動畫文件是通過xml文件來配置的,如果你喜歡,也可以通過在java代碼中創建AnimationDrawable對象,然後通過addFrame(Drawable frame, int ration)方法向動畫添加幀,然後start()。。。

二、Tween Animation:(補間動畫)

補間動畫就是我們只需指定開始、結束的「關鍵幀「,而變化中的其他幀由系統來計算,不必自己一幀幀的去定義。

1. Android使用Animation代表抽象動畫,包括四種子類:AlphaAnimation(透明度動畫)、ScaleAnimation(縮放動畫)、TranslateAnimation(位移動畫)、RotateAnimation(透明度動畫)。Android裡面允許在java中創建Animation類對象,但是一般都會採用動畫資源文件來定義動畫,把界面與邏輯分離

<set android:interpolator="@android:anim/linear_interpolator" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定義透明度的變換 -->

<!-- 定義旋轉變換 -->
<rotate android:ration="3000/" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="1800">
</rotate></alpha></set>

(一個set可以同時定義多個動畫,一起執行。)

2. android:interpolator=@android:anim/linear_interpolator控制動畫期間需要補入多少幀,簡單來說就是控制動畫速度,有些地方翻譯為「插值「。Interpolator有幾種實現類:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator,具體使用可以參考官方API Demo。

3. 定義好anim文件後,我們可以通過AnimationUtils工具類來載入它們,載入成功後返回一個Animation。然後就可以通過View的startAnimation(anim)開始執行動畫了。

Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//設置動畫結束後保留結束狀態
anim.setFillAfter(true);
//設置插值效果
anim.setInterpolator(interpolator);
//對view執行動畫
view. startAnimation(anim);

三、Property Animation:(屬性動畫)

屬性動畫,這個是在Android 3.0中才引進的,它可以直接更改我們對象的屬性。在上面提到的Tween Animation中,只是更改View的繪畫效果而View的真實屬性是不改變的。假設你用Tween動畫將一個Button從左邊移到右邊,無論你怎麼點擊移動後的Button,他都沒有反應。而當你點擊移動前Button的位置時才有反應,因為Button的位置屬性木有改變。而Property Animation則可以直接改變View對象的屬性值,這樣可以讓我們少做一些處理工作,提高效率與代碼的可讀性。

(1)ValueAnimator:包含Property Animation動畫的所有核心功能,如動畫時間,開始、結束屬性值,相應時間屬性值計算方法等。應用ValueAnimator有兩個步驟

1計算屬性值。

2根據屬性值執行相應的動作,如改變對象的某一屬性。

我們的主是第二步,需要實現ValueAnimator.onUpdateListener介面,這個介面只有一個函數onAnimationUpdate(),將要改變View對象屬性的事情在該介面中do。

animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});

(2)ObjectAnimator:繼承自ValueAnimator,要指定一個對象及該對象的一個屬性,當屬性值計算完成時自動設置為該對象的相應屬性,即完成了Property Animation的全部兩步操作。實際應用中一般都會用ObjectAnimator來改變某一對象的某一屬性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,應該滿足以下條件:

1.對象應該有一個setter函數:set(駝峰命名法)

2如下面的例子,像ofFloat之類的工場方法,第一個參數為對象名,第二個為屬性名,後面的參數為可變參數,如果values…參數只設置了一個值的話,那麼會假定為目的值,屬性值的變化范圍為當前值到目的值,為了獲得當前值,該對象要有相應屬性的getter方法:get

3如果有getter方法,其應返回值類型應與相應的setter方法的參數類型一致。

ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();

如果不滿足上面的條件,我們只能乖乖的使用ValueAnimator來創建動畫。

(3)Animator.AnimatorListener:可以為Animator設置動畫監聽,需要重寫下面四個方法。

onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()

這里我們也可以實現AnimatorListenerAdapter,他的好處是可以只用定義想監聽的事件而不用實現每個函數卻只定義一空函數體。如下:

anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});

(4)AnimationSet:可以組合多個動畫共同工作

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();

上面的代碼意思是: 首先播放anim1;同時播放anim2,anim3,anim4;最後播放anim5。

(5)TimeInterplator:與Tween中的interpolator類似。有以下幾種

AccelerateInterpolator 加速,開始時慢中間加速

DecelerateInterpolator 減速,開始時快然後減速

先加速後減速,開始結束時慢,中間加速

AnticipateInterpolator 反向 ,先向相反方向改變一段再加速播放

反向加回彈,先向相反方向改變,再加速播放,會超出目的值然後緩慢移動至目的值

BounceInterpolator 跳躍,快到目的值時值會跳躍,如目的值100,後面的值可能依次為85,77,70,80,90,100

CycleIinterpolator 循環,動畫循環一定次數,值的改變為一正弦函數:Math.sin(2 * mCycles * Math.PI * input)

LinearInterpolator 線性,線性均勻改變

OvershottInterpolator 回彈,最後超出目的值然後緩慢改變到目的值

TimeInterpolator 一個介面,允許你自定義interpolator,以上幾個都是實現了這個介面

(6)Keyframes:可以讓我們定義除了開始和結束以外的關鍵幀。KeyFrame是抽象類,要通過ofInt(),ofFloat(),ofObject()獲得適當的KeyFrame,然後通過PropertyValuesHolder.ofKeyframe獲得PropertyValuesHolder對象,如下:

Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
上述代碼的意思是:設置btn對象的width屬性值使其:開始時 Width=400,動畫開始1/4時 Width=200,動畫開始1/2時 Width=400,動畫開始3/4時 Width=100,動畫結束時 Width=500。

(7)ViewPropertyAnimator:對一個View同時改變多種屬性,非常推薦用這種。該類對多屬性動畫進行了優化,會合並一些invalidate()來減少刷新視圖。而且使用起來非常簡便,但是要求API LEVEL 12,即Android 3.1以上。僅需要一行代碼即可完成水平、豎直移動

myView.animate().translationX(50f). translationY(100f);

(8)常需要改變的一些屬性:

translationX,translationY: View相對於原始位置的偏移量

rotation,rotationX,rotationY: 旋轉,rotation用於2D旋轉角度,3D中用到後兩個

scaleX,scaleY: 縮放比

x,y: View的最終坐標,是View的left,top位置加上translationX,translationY

alpha: 透明度

四、最後自己總結一下這三種動畫的優缺點:

(1)Frame Animation(幀動畫)主要用於播放一幀幀准備好的圖片,類似GIF圖片,優點是使用簡單方便、缺點是需要事先准備好每一幀圖片;

(2)Tween Animation(補間動畫)僅需定義開始與結束的關鍵幀,而變化的中間幀由系統補上,優點是不用准備每一幀,缺點是只改變了對象繪制,而沒有改變View本身屬性。因此如果改變了按鈕的位置,還是需要點擊原來按鈕所在位置才有效。

(3)Property Animation(屬性動畫)是3.0後推出的動畫,優點是使用簡單、降低實現的復雜度、直接更改對象的屬性、幾乎可適用於任何對象而僅非View類,缺點是需要3.0以上的API支持,限制較大!但是目前國外有個開源庫,可以提供低版本支持!

⑻ Android 共享元素效果

Transition 框架是 Android 4.4 KitKat 中加入的,但在 5.0 才開始被人應用起來,
而且這一部分也涉及了 22.0 的 API,雖然有對應的 support.v4 包,但也還是有點問題。
所以這一部分可以說是 5.0 以上適用的方法。

效果(錄制出來的效果有點卡頓):

這里遇到一點小問題,即上述 Activity 引用的 style 中不僅設置了 android:windowIsTranslucent ,也設置了 android:windowIsTranslucent : 讓 Activity 的背景為透明,在我測試的時候發現使用共享元素的時候出現了返回時閃屏的現象,解決方法是設置 Activity 背景顏色為透明。
在 onCreate 中:

或者在上述的 style 中的 theme 添加:

在打開的 Activity 的 xml 中

對應的 ImageView 中的 android:transitionName 屬性值必須相同,而對兩個控制項的大小、id 等屬性並無要求。

在 makeSceneTransitionAnimation 傳入的參數中,mImgView 是第一個界面中 ImageView 的實例,第三個參數對應 xml 中的 android:transitionName 的值。

因為打開新的 Activity 的時候,可能要去載入新的圖片,這時候我們需要 延遲過渡動畫的開始 ,直到圖片載入完成之後再開始動畫。否則會出現各種 bug。
所以要在第二個 Activity 中的 onCreate() 中阻止動畫的執行:

然後在圖片載入完成後開始動畫:

當然,啟動動畫不一定要等待圖片載入完成再進行,因為還存在著圖片載入失敗、載入時間過長等問題,這里只是提出一種方法,實際還是自己看情況決定。

以上只是簡單的實現了一種效果,關於 Transition 的使用、共享元素在
Fragment 中的使用、多個共享元素的使用等,在這里暫時不打算細講,可以參考:
使用 Transition FrameWork 實現有意義的轉場動畫(譯)
(譯)Android 5.0 頁面共享元素過渡
定義定製動畫

原理大概就是如此,實現動畫的方法有很多種。
可以參考:
Activity 共享元素轉場動畫實踐
Android共享元素轉場動畫兼容實踐

⑼ Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)

屬性動畫對比原來的視圖動畫有很多的優點,屬性動畫可以對所有的對象做動畫操作,但Android開發中需要做動畫最多的還是View,如果只是對一個view做動畫,很少的幾個屬性還行,如果是對同一個view的十幾個屬性同時做動畫,相信屬性動畫的寫法是比較繁瑣的。ViewPropertyAnimator從名字就可以看出是專用於View的屬性動畫,在API12被提供。ViewPropertyAnimator專用於操作View動畫,語法更加簡潔,使用更加方便。
developer: https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator

如何獲取ViewPropertyAnimator 對象:
ViewPropertyAnimator 沒有構造函數,通過View.animate()方法可以方便的獲取ViewPropertyAnimator 對象,此時獲取的動畫對象就專用於操作當前view。

setDuration(); //設置動畫時長
setInterpolator(); //設置插值器
setStartDelay(); //設置延遲開始時間
start(); //立刻開始動畫
cancel(); //取消動畫

明顯看到圖片先往下走了一段,然後向左的動畫才開始執行。

鏈式操作
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).translationY(300).scaleX(0.5f);

以上函數的執行,會導致相同動畫的cancle,以上函數都是除了坐標相關都是以view左上角為坐標原點。

方法都比較簡單,下面距幾個列子:

首先利用translationX,translationXBy來區分By的意義:
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationY(300);

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationYBy(300);

translationYBy 可以多次移動View,translationY多次執行沒有效果。

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).x(100).y(100);

ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).rotation(270);

據觀察withEndAction相當於動畫開始,withStartAction相當於動畫結束。

可以看到可以添加setUpdateListener監聽,但無法通過這個監聽函數監聽到當前動畫的信息,所以這個監聽函數可能用處不大。

Animation動畫概述和執行原理
Android動畫之補間動畫TweenAnimation
Android動畫之逐幀動畫FrameAnimation
Android動畫之插值器簡介和系統默認插值器
Android動畫之插值器Interpolator自定義
Android動畫之視圖動畫的缺點和屬性動畫的引入
Android動畫之ValueAnimator用法和自定義估值器
Android動畫之ObjectAnimator實現補間動畫和ObjectAnimator自定義屬性
Android動畫之ObjectAnimator中ofXX函數全解析-自定義Property,TypeConverter,TypeEvaluator
Android動畫之AnimatorSet聯合動畫用法
Android動畫之LayoutTransition布局動畫
Android動畫之共享元素動畫
Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)
Android動畫之Activity切換動畫overridePendingTransition實現和Theme Xml方式實現
Android動畫之ActivityOptionsCompat概述
Android動畫之場景變換Transition動畫的使用
Android動畫之Transition和TransitionManager使用
Android動畫之圓形揭露動畫Circular Reveal
Android 動畫之 LayoutAnimation 動畫
Android動畫之視圖動畫的缺點和屬性動畫的引入

⑽ android中怎麼實現屬性動畫

手機上去實現一些動畫效果算是件比較炫酷的事情,因此Android系統在一開始的時候就給我們提供了兩種實現動畫效果的方式,逐幀動畫(frame-by-frame animation)和補間動畫(tweened animation)。逐幀動畫的工作原理很簡單,其實就是將一個完整的動畫拆分成一張張單獨的圖片,然後再將它們連貫起來進行播放,類似於動畫片的工作原理。補間動畫則是可以對View進行一系列的動畫操作,包括淡入淡出、縮放、平移、旋轉四種。

熱點內容
玩和平精英的時候伺服器發呆了怎麼辦 發布:2025-04-05 11:02:40 瀏覽:382
怎麼把蘋果的號轉到安卓手機上 發布:2025-04-05 10:39:05 瀏覽:533
存儲核心架構瓶頸已被攻破 發布:2025-04-05 10:38:27 瀏覽:308
空間新演算法 發布:2025-04-05 10:33:21 瀏覽:708
蜀門和遠征哪個配置低 發布:2025-04-05 10:23:50 瀏覽:287
linux下jdk的安裝 發布:2025-04-05 10:12:20 瀏覽:70
單機江湖腳本 發布:2025-04-05 10:08:32 瀏覽:767
愛奇藝離線緩存怎麼傳藍牙 發布:2025-04-05 10:00:48 瀏覽:143
阿里雲伺服器內存超頻 發布:2025-04-05 10:00:48 瀏覽:578
如何登錄pubg國際服安卓手機 發布:2025-04-05 09:40:07 瀏覽:414