導航:首頁 > 操作系統 > android透明度動畫

android透明度動畫

發布時間:2023-03-30 16:21:11

『壹』 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 動畫詳解

  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通過監聽動畫過程,自己改變對象屬性完成動畫

『叄』 android 如何讓控制項慢慢展開

Android為了用戶和消獲得更好的體驗,引入了動畫的概念,有逐禎的方式,所以為了讓控制項展開,可以利用Anima這個類提供的方法,可以參考這位前輩的方式,代碼如下:

注釋已經很清楚了,在普及以下android動畫的概念:

Tween Animation有四種形式:

1.漸變透明度動畫效果。

2.漸變尺寸伸蔽昌縮動畫效果。

3.畫面位置移動動畫效果。

4.畫面旋轉動畫效果。

這四種動畫實現方式都是通過Animation類和AnimationUtils配合實現。

可以通過xml實現:動畫的XML文件在工程中res/anim目錄。還有一種就是我上面所說的逐禎動畫了,具體的用宏棚扒法可以再網路一下,有很多資料可以參考。

『肆』 【Android 動畫】動畫詳解之補間動畫(一)

之前很早就想寫寫Android 的動畫,最近剛好有時間,大概聊一聊安卓動畫。

個人習慣將動畫分為:補間動畫(透明度、旋轉、位移、縮放)、幀動畫、和屬性動畫,這一篇,我們先說說補間動畫。
補間動畫這個詞出於flash,在兩個關鍵幀( 可以理解成動畫開始和結束 )中間需要做「補間動畫」,才能實現圖畫的運動;插入補間動畫後兩個關鍵幀之間的插補幀是由計算機自動運算而得到的。
實際上,Android 的補間動畫也是由我們指定動畫開始、動畫結束2個關鍵點,中間部分的動畫由系統完成

在正式開始之前,我們先說下Android 系統的坐標系,屏幕左上角為坐標原點,假如屏幕為1080*1980,那麼左上角為(0,0),右上角為(1080,0),左下角為(0,1980),右下角為(1080,1980)

所有動畫有以下公共屬性,注釋比較詳細,這里就不在詳述了

ScaleAnimation有3種構造方法

我們先看第一種,其起始比例為0,縮放比例為1.4,即放大到1.4倍

效果如下:

第二種,pivotx,pivotY分別代表起始位置的x、y方向的坐標,我們設置為(100,100)

效果如下:

第三種,pivotXType和pivotYType有2種模式,RELATIVE_TO_SELF(相對於自身)和RELATIVE_TO_PARENT(相對於父布局),如果設置這個,pivotx,pivotY的值就應該是0-1的浮點數,這里分別對應xml中的%(自身)和%p(父布局)

TranslateAnimation有2種構造方法,和ScaleAnimation類似

效果如下:

效果如下:

RELATIVE_TO_PARENT

效果如下:

RotateAnimation有3種構造方法

順時針720度

效果如下:

逆時針720度

效果如下:

效果如下:

再來RELATIVE_TO_PARENT

效果如下:

這是什麼鬼???怎麼跑到屏幕外面去了?
原來設置為RELATIVE_TO_PARENT時,旋轉中心x方向應該為該空間離左邊的邊距+父布局寬度/2,y方向同理,而此時,我們布局中紅色的Textview為居中狀態,所以旋轉中心為屏幕右下角。讓我們來看個例子
修改布局如下:

效果如下:

這時,我們看到旋轉中心x方向為離左邊100dp處

AlphaAnimation只有1種構造方法

其中fromAlpha為動畫開始的透明度;toAlpha為動畫結束的透明度

效果如下:

效果如下:

AnimationSet是一個動畫的集合,可以按照添加的順序播放動畫,讓我們來看個例子,通過組合動畫,實現旋轉漸入動畫

效果如下:

到這里,補間動畫就介紹完了

參考資料: 自定義控制項三部曲之動畫篇

『伍』 android屬性動畫詳解

在 Android 動畫中,總共有兩種類型的動畫View Animation(視圖動畫)和Property Animator(屬性動畫);其中
View Animation包括Tween Animation(補間動畫)和Frame Animation(逐幀動畫);
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直觀上,他們有如下三點不同:
1、引入時間不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才開始有Property Animation相關的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、動畫類的命名不同: View Animation中動畫類取名都叫XXXXAnimation,而在Property Animator中動畫類的取名則叫XXXXAnimator大家都知道逐幀動畫主要是用來實現動畫的,而補間動畫才能實現控制項的漸入漸出、移動、旋轉和縮放的;而Property Animator是在Android 3.0版本才引入的,之前是沒有的。
為什麼還要引入Property Animator呢?
1、為什麼引入Property Animator(屬性動畫)
我提出一個假設:請問大家,如何利用補間動畫來將一個控制項的背景色在一分鍾內從綠色變為紅色?這個效果想必沒辦法僅僅通過改變控制項的漸入漸出、移動、旋轉和縮放來實現吧,而這個效果是可以通過Property Animator完美實現的
**這就是第一個原因:Property Animator能實現補間動畫無法實現的功能 **大家都知道,補間動畫和逐幀動畫統稱為View Animation,也就是說這兩個動畫只能對派生自View的控制項實例起作用;而Property Animator則不同,從名字中可以看出屬性動畫,應該是作用於控制項屬性的!正因為屬性動畫能夠只針對控制項的某一個屬性來做動畫,所以也就造就了他能單獨改變控制項的某一個屬性的值!比如顏色!這就是Property Animator能實現補間動畫無法實現的功能的最重要原因。
**我們得到了第二點不同:View Animation僅能對指定的控制項做動畫,而Property Animator是通過改變控制項某一屬性值來做動畫的。
**假設我們將一個按鈕從左上角利用補間動畫將其移動到右下角,在移動過程中和移動後,這個按鈕都是不會響應點擊事件的。這是為什麼呢?因為補間動畫僅僅轉變的是控制項的顯示位置而已,並沒有改變控制項本身的值。View Animation的動畫實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪制參數,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效區域還是應用動畫之前的區域;我們看到的效果僅僅是系統作用在按鈕上的顯示效果,利用動畫把按鈕從原來的位置移到了右下角,但按鈕內部的任何值是沒有變化的,所以按鈕所捕捉的點擊區域仍是原來的點擊區域。(下面會舉例來說明這個問題)
這就得到了第三點不同:補間動畫雖能對控制項做動畫,但並沒有改變控制項內部的屬性值。而Property Animator則是恰恰相反,Property Animator是通過改變控制項內部的屬性值來達到動畫效果的

我們前面講了Property Animator包括ValueAnimator和ObjectAnimator;這篇文章就主要來看看ValueAnimator的使用方法吧。
我覺得谷歌那幫老頭是最會起名字的人,單從命名上,就能看出來這個東東的含義。ValueAnimator從名字可以看出,這個Animation是針對值的! ValueAnimator不會對控制項做任何操作,我們可以給它設定從哪個值運動到哪個值,通過監聽這些值的漸變過程來自己操作控制項。 它會自己計算動畫的過程,然後我們需要監聽它的動畫過程來自己操作控制項。

這就是ValueAnimator的功能:ValueAnimator對指定值區間做動畫運算,我們通過對運算過程做監聽來自己操作控制項。
總而言之就是兩點:
1. ValueAnimator只負責對指定的數字區間進行動畫運算
2. 我們需要對運算過程進行監聽,然後自己對控制項做動畫操作

插值器的意義其實就相當於物理公式中的加速度參數,所以這也就是它也叫加速器的原因。 如何自定義插值器:

**input參數與任何我們設定的值沒關系,只與時間有關,隨著時間的增長,動畫的進度也自然的增加,input參數就代表了當前動畫的進度。而返回值則表示動畫的當前數值進度 **

在getInterpolation函數中,我們將進度反轉過來,當傳0的時候,我們讓它數值進度在完成的位置,當完成的時候,我們讓它在開始的位置

ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重寫了幾個方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重寫的ofFloat方法如何實現一個動畫:(改變透明度)

前面我們都是定義多個值,即至少兩個值之間的變化,那如果我們只定義一個值呢,如下面的方式:(同樣以MyPointView為例)

僅且僅當我們只給動畫設置一個值時,程序才會調用屬性對應的get函數來得到動畫初始值。如果動畫沒有初始值,那麼就會使用系統默認值。比如ofInt()中使用的參數類型是int類型的,而系統的Int值的默認值是0,所以動畫就會從0運動到100;也就是系統雖然在找到不到屬性對應的get函數時,會給出警告,但同時會用系統默認值做為動畫初始值。
如果通過給自定義控制項MyPointView設置了get函數,那麼將會以get函數的返回值做為初始值。

根據 View setBackGroundColor() 方法可以自定義條用屬性動畫。

『陸』 Android中動畫有哪幾類,它們的特點與區別是什麼

有兩種,一種就是Tween(補間)動畫,還有一種就是Frame(幀)動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

『柒』 android怎麼設置動畫逐漸透明

在xml中定義:
alpha.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 透明度控制動畫效果 alpha
浮點型值:
fromAlpha 屬性為動畫起始時透明度
toAlpha 屬性為動畫結束時透明度
說明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字

長整型值:
ration 屬性為動畫持續時間
說明:
時間以毫秒為單位 -->

<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:ration="5000"
/>
</set>

『捌』 安卓 編程如何為一個圖片加上透明度和平移兩個動畫

Drawable 最強大的功能是:顯示Animation。Android SDK介紹了2種Animation:

•Tween Animation(漸變動畫):通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果
•Frame Animation(幀動畫) :順序播放事先做好的圖像,類似放電影
在使用Animation前,我們先學習如何定義Animation,這對我們使用Animation會有很大的幫助。Animation是以XML格式定義的,定義好的XML文件存放在res/anim中。由於Tween Animation與Frame Animation的定義、使用都有很大的差異,我們將分開介紹,本篇幅中介紹Tween Animation的定義與使用,後續篇幅再詳細介紹Frame Animation。按照XML文檔的結構【父節點,子節點,屬性】來介紹Tween Animation,其由4種類型:

•Alpha:漸變透明度動畫效果
•Scale:漸變尺寸伸縮動畫效果
•Translate:畫面轉換位置移動動畫效果
•Rotate:畫面轉換位置移動動畫效果
在介紹以上4種類型前,先介紹Tween Animation共同的節點屬性。

表一

屬性[類型] 功能
Duration[long] 屬性為動畫持續時間 時間以毫秒為單位
fillAfter [boolean] 當設置為true ,該動畫轉化在動畫結束後被應用
fillBefore[boolean] 當設置為true ,該動畫轉化在動畫開始前被應用
interpolator
指定一個動畫的插入器 有一些常見的插入器
accelerate_decelerate_interpolator
加速-減速 動畫插入器
accelerate_interpolator
加速-動畫插入器
decelerate_interpolator
減速- 動畫插入器
其他的屬於特定的動畫效果
repeatCount[int] 動畫的重復次數
repeatMode[String] 定義重復的行為 1:"restart" 2:"reverse" eg: android:repeatMode="reverse"

startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫
zAdjustment[int] 定義動畫的Z Order的改變 0:保持Z Order不變
1:保持在最上層
-1:保持在最下層

看了以上節點,大家是不是都想開始定義動畫了。下面我們就開始結合具體的例子,介紹4種類型各自特有的節點元素。

表二

XML節點 功能說明
alpha 漸變透明度動畫效果
<alpha
android:fromAlpha=」0.1″
android:toAlpha=」1.0″
android:ration=」3000″ />
fromAlpha 屬性為動畫起始時透明度
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字
toAlpha 屬性為動畫結束時透明度
表三

scale 漸變尺寸伸縮動畫效果
<scale
android:interpolator= 「@android:anim/accelerate_decelerate_interpolator」
android:fromXScale=」0.0″
android:toXScale=」1.4″
android:fromYScale=」0.0″
android:toYScale=」1.4″
android:pivotX=」50%」
android:pivotY=」50%」
android:fillAfter=」false」
android:startOffset=「700」
android:ration=」700″
android:repeatCount=」10″ />
fromXScale[float] fromYScale[float] 為動畫起始時,X、Y坐標上的伸縮尺寸 0.0表示收縮到沒有
1.0表示正常無伸縮
值小於1.0表示收縮
值大於1.0表示放大
toXScale [float]
toYScale[float] 為動畫結束時,X、Y坐標上的伸縮尺寸
pivotX[float]
pivotY[float] 為動畫相對於物件的X、Y坐標的開始位置 屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置

表四

translate 畫面轉換位置移動動畫效果
<translate
android:fromXDelta=」30″
android:toXDelta=」-80″
android:fromYDelta=」30″
android:toYDelta=」300″
android:ration=」2000″ />
fromXDelta
toXDelta 為動畫、結束起始時 X坐標上的位置
fromYDelta
toYDelta 為動畫、結束起始時 Y坐標上的位置

表五

rotate 畫面轉移旋轉動畫效果
<rotate
android:interpolator=」@android:anim/accelerate_decelerate_interpolator」
android:fromDegrees=」0″
android:toDegrees=」+350″
android:pivotX=」50%」
android:pivotY=」50%」
android:ration=」3000″ />
fromDegrees 為動畫起始時物件的角度 說明
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大於360度
pivotX
pivotY 為動畫相對於物件的X、Y坐標的開始位 說明:以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置

按照上面的講述學習完了Tween Animation的定義,對Tween Animation有了詳細的了解,再去了解下Android SDK的animation package(android.view.animation),其提供了操作Tween Animation所有的類。

Android SDK提供了基類:Animation,包含大量的set/getXXXX()函數來設置、讀取Animation的屬性,也就是前面表一中顯示的各種屬性。Tween Animation由4種類型:alpha、scale、translate、roate,在Android SDK中提供了相應的類,Animation類派生出了AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation分別實現了平移、旋轉、改變 Alpha 值等動畫,每個子類都在父類的基礎上增加了各自獨有的屬性。再去看下這幾個類的構造函數,是不是與我們在表二、表三、表四、表五種定義的屬性完全一樣。

在了解了Tween Animation的定義,對android.view.animation有了一些基本的認識後,開始介紹Tween Animation如何使用。Android SDK提供了2種方法:1、直接從XML資源中讀取Animation;2、使用Animation子類的構造函數來初始化Animation對象。第二種方法在看了Android SDK中各個類的說明就知道如何使用了,下面簡要說明從XML資源中讀取Animation,按照應用程序開發的過程,介紹整個使用的過程,如下:

1.創建Android工程;
2.導入一張圖片資源;
3.在res/layout/main.xml中添加一個 ImageView Widget;
4.在res下創建新的文件夾且命名為:anim,並在此文件夾下面定義 Animation XML 文件;
5.修改OnCreate()中的代碼,顯示動畫資源;
關鍵代碼,解析如下:

//main.xml中的ImageView

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

//載入動畫

Animation hyperspaceJumpAnimation =

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);

//使用ImageView顯示動畫

spaceshipImage.startAnimation(hyperspaceJumpAnimation);

這里簡要解析如下:

•AnimationUtils提供了載入動畫的函數,除了函數loadAnimation(),其他的到Android SDK中去詳細了解吧;
•所謂的動畫,也就是對 view 的內容做一次圖形變換;
Android 中的 Animation 應用(二)

對Tween Animation的本質做個總結:Tween Animation通過對 View 的內容完成一系列的圖形變換 (包括平移、縮放、旋轉、改變透明度)來實現動畫效果。具體來講,預先定義一組指令,這些指令指定了圖形變換的類型、觸發時間、持續時間。這些指令可以是以 XML 文件方式定義,也可以是以源代碼方式定義。程序沿著時間線執行這些指令就可以實現動畫效果。

在這里,我們需要對2個問題進行深入的解析:

•動畫的運行時如何控制的?
•動畫的運行模式。
如何控制動畫的運行?
這個問題,我們也就也就是上一篇幅中提到的Tween Animation,估計大家對什麼是Interpolator、到底有什麼作用,還是一頭霧水,在這里做個詳細的說明。按照Android SDK中對interpolator的說明:interpolator定義一個動畫的變化率(the rate of change)。這使得基本的動畫效果(alpha, scale, translate, rotate)得以加速,減速,重復等。

用通俗的一點的話理解就是:動畫的進度使用 Interpolator 控制。Interpolator 定義了動畫的變化速度,可以實現勻速、正加速、負加速、無規則變加速等。Interpolator 是基類,封裝了所有 Interpolator 的共同方法,它只有一個方法,即 getInterpolation (float input),該方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了幾個 Interpolator 子類,實現了不同的速度曲線,如下:

在動畫開始與介紹的地方速率改變比較慢,在中間的時候加速
AccelerateInterpolator 在動畫開始的地方速率改變比較慢,然後開始加速
CycleInterpolator 動畫循環播放特定的次數,速率改變沿著正弦曲線
DecelerateInterpolator 在動畫開始的地方速率改變比較慢,然後開始減速
LinearInterpolator 在動畫的以均勻的速率改變

對於 LinearInterpolator ,變化率是個常數,即 f (x) = x.

public float getInterpolation(float input) {

return input;
}
Interpolator其他的幾個子類,也都是按照特定的演算法,實現了對變化率。還可以定義自己的 Interpolator 子類,實現拋物線、自由落體等物理效果。

動畫的運行模式
動畫的運行模式有兩種:

•獨占模式,即程序主線程進入一個循環,根據動畫指令不斷刷新屏幕,直到動畫結束;
•中斷模式,即有單獨一個線程對時間計數,每隔一定的時間向主線程發通知,主線程接到通知後更新屏幕;
額外補充說明:Transformation 類
Transformation 記錄了仿射矩陣 Matrix,動畫每觸發一次,會對原來的矩陣做一次運算, View 的 Bitmap 與這個矩陣相乘就可實現相應的操作(旋轉、平移、縮放等)。Transformation 類封裝了矩陣和 alpha 值,它有兩個重要的成員,一是 mMatrix,二是 mAlpha。Transformation 類圖如下所示:

總結說明
圖形變換通過仿射矩陣實現。圖形變換是圖形學中的基本知識,簡單來講,每種變換都是一次矩陣運算。在 Android 中,Canvas 類中包含當前矩陣,當調用 Canvas.drawBitmap (bmp, x, y, Paint) 繪制時,Android 會先把 bmp 做一次矩陣運算,然後將運算的結果顯示在 Canvas 上。這樣,編程人員只需不斷修改 Canvas 的矩陣並刷新屏幕,View 里的對象就會不停的做圖形變換,因此就形成了動畫。

Android 中的 Animation 應用(三)

前面我們詳細介紹了Tween Aniamation,這節我將介紹另外一種動畫Frame Animation。在前面已經說過,Frame Animation是順序播放事先做好的圖像,與電影類似。不同於animation package, Android SDK提供了另外一個類AnimationDrawable來定義、使用Frame Animation。

Frame Animation可以在XML Resource定義(還是存放到res/anim文件夾下),也可以使用AnimationDrawable中的API定義。由於Tween Animation與Frame Animation有著很大的不同,因此XML定義的格式也完全不一樣,其格式是:首先是animation-list根節點,animation-list根節點中包含多個item子節點,每個item節點定義一幀動畫:當前幀的drawable資源和當前幀持續的時間。下面對節點的元素加以說明:

XML屬性 說明
drawable 當前幀引用的drawable資源
ration 當前幀顯示的時間(毫秒為單位)
oneshot 如果為true,表示動畫只播放一次停止在最後一幀上,如果設置為false表示動畫循環播放。
variablePadding If true, allows the drawable』s padding to change based on the current state that is selected.
visible 規定drawable的初始可見性,默認為flase;

下面就給個具體的XML例子,來定義一幀一幀的動畫:

<animation-list xmlns:android=」http://schemas.android.com/apk/res/android」
android:oneshot=」true」>
<item android:drawable=」@drawable/rocket_thrust1″ android:ration=」200″ />
<item android:drawable=」@drawable/rocket_thrust2″ android:ration=」200″ />
<item android:drawable=」@drawable/rocket_thrust3″ android:ration=」200″ />
</animation-list>

上面的XML就定義了一個Frame Animation,其包含3幀動畫,3幀動畫中分別應用了drawable中的3張圖片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每幀動畫持續200毫秒。

然後我們將以上XML保存在res/anim/文件夾下,命名為rocket_thrust.xml,顯示動畫的代碼,如下:在OnCreate()中增加如下代碼:

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);

rocketImage.setBackgroundResource(R.anim.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

最後還需要增加啟動動畫的代碼:

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

rocketAnimation.start();

return true;

}

return super.onTouchEvent(event);
}

代碼運行的結果想必大家應該就知道了(3張圖片按照順序的播放一次),不過有一點需要強調的是:啟動Frame Animation動畫的代碼rocketAnimation.start(); 不能在OnCreate()中,因為在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定,在OnCreate()中啟動動畫,就只能看到第一張圖片。
下面,閱讀Android SDK中對AnimationDrawable的介紹,有個簡單的了解:

AnimationDrawable

獲取、設置動畫的屬性
int getDuration() 獲取動畫的時長
int getNumberOfFrames() 獲取動畫的幀數
boolean isOneShot()

Void setOneShot(boolean oneshot)
獲取oneshot屬性
設置oneshot屬性
void inflate(Resurce r,XmlPullParser p,
AttributeSet attrs)
增加、獲取幀動畫
Drawable getFrame(int index) 獲取某幀的Drawable資源
void addFrame(Drawable frame,int ration) 為當前動畫增加幀(資源,持續時長)
動畫控制
void start() 開始動畫
void run() 外界不能直接掉調用,使用start()替代
boolean isRunning() 當前動畫是否在運行
void stop() 停止當前動畫

總結說明

Frame Animation的定義、使用比較簡單,在這里已經詳細介紹完了,更加深入的學習還是到Android SDK去仔細了解吧,在Android SDK中也包含很多這方面的例子程序。註:Frame Animation 的XML 文件中不定義 interpolator 屬性,因為定義它沒有任何意義。

閱讀全文

與android透明度動畫相關的資料

熱點內容
變數作用域是編譯器決定的嗎 瀏覽:755
linux結構分析 瀏覽:812
程序員記錄歷史 瀏覽:798
編譯器怎麼調用構造函數的 瀏覽:95
高質量cpdf 瀏覽:821
福建電信代理伺服器雲主機 瀏覽:616
美圖看看pdf 瀏覽:432
編譯後報錯 瀏覽:291
網路設備怎麼加密 瀏覽:785
hbuilderx文件夾有哪些 瀏覽:102
空調壓縮機生產板塊 瀏覽:612
開源多媒體伺服器都有什麼 瀏覽:392
反編譯了別人的app會被發現嗎 瀏覽:918
上海光裕汽車壓縮機有限公司 瀏覽:333
連接ps4伺服器地址 瀏覽:136
新神魔大陸三星賬號是什麼伺服器 瀏覽:677
壓縮機lj100cy 瀏覽:556
王者系統怎麼轉回安卓系統 瀏覽:749
linux查看路由表命令 瀏覽:506
高手程序員使用什麼筆記本 瀏覽:440