多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android Animation學習筆記

Android Animation學習筆記

來源:程序員人生   發布時間:2015-03-23 08:07:33 閱讀次數:4091次

關于動畫的實現,Android提供了Animation,在Android SDK介紹了2種Animation模式:

1. Tween Animation:通過對場景里的對象不斷做圖象變換(平移、縮放、旋轉)產生動畫效果,即是1種漸變動畫;

2. Frame Animation:順序播放事前做好的圖象,是1種畫面轉換動畫。

動畫類型

下面先來看看Android提供的動畫類型。Android的animation由4種類型組成

在XML文件中:

  • alpha        漸變透明度動畫效果
  • scale        漸變尺寸伸縮動畫效果
  • translate  畫面轉換位置移動動畫效果
  • rotate      畫面轉移旋轉動畫效果

在Java 源碼中定義了相應的類,可使用這些類的方法來獲得和操作相應的屬性:

  • AlphaAnimation漸變透明度動畫效果
  • ScaleAnimation漸變尺寸伸縮動畫效果
  • TranslateAnimation畫面轉換位置移動動畫效果
  • RotateAnimation畫面轉移旋轉動畫效果

image

Tween Animation

1個tween動畫將對視圖對象中的內容進行1系列簡單的轉換(位置,大小,旋轉,透明性)。如果你有1個文本視圖對象,你可以移動它,旋轉它,讓它變大或讓它變小,如果文字下面還有背景圖象,背景圖象也會隨著文件進行轉換。

使用XML來定義Tween Animation

動畫的XML文件在工程中res/anim目錄,這個文件必須包括1個根元素,可使<alpha><scale> <translate> <rotate>插值元素或是把上面的元素都放入<set>元素組中,默許情況下,所以的動畫指令都是同時產生的,為了讓他們按序列產生,需要設置1個特殊的屬性startOffset。動畫的指令定義了你想要產生甚么樣的轉換,當他們產生了,應當履行多長時間,轉換可以是連續的也能夠使同時的。例如,你讓文本內容從左側移動到右側,然后旋轉180度,或在移動的進程中同時旋轉,沒個轉換需要設置1些特殊的參數(開始和結束的大小尺寸的大小變化,開始和結束的旋轉角度等等,也能夠設置些基本的參數(例如,開始時間與周期),如果讓幾個轉換同時產生,可以給它們設置相同的開始時間,如果按序列的話,計算開始時間加上其周期。

Tween Animation共同的節點屬性

屬性[類型] 功能 備注
Duration[long] 屬性為動畫延續時間 時間以毫秒為單位
fillAfter [boolean] 當設置為true ,該動畫轉化在動畫結束后被利用
fillBefore[boolean] 當設置為true ,該動畫轉化在動畫開始前被利用

interpolator

指定1個動畫的插入器 有1些常見的插入器
accelerate_decelerate_interpolator
加速-減速 動畫插入器
accelerate_interpolator
加速-動畫插入器
decelerate_interpolator
減速- 動畫插入器
其他的屬于特定的動畫效果
repeatCount[int] 動畫的重復次數  
RepeatMode[int] 定義重復的行動 1:重新開始  2:plays backward
startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始履行下個動畫
zAdjustment[int] 定義動畫的Z Order的改變 0:保持Z Order不變
1:保持在最上層
⑴:保持在最下層

表2

XML節點 功能說明
alpha 漸變透明度動畫效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

屬性為動畫起始時透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0⑴.0之間的float數據類型的數字

duration為動畫延續時間,ms單位

toAlpha

屬性為動畫結束時透明度

表3

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:duration=”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%⑴00%中取值,50%為物件的X或Y方向坐標上的中點位置
       

表4

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

表5

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

下面給出1個完全的XML定義(SDK提供)

<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="⑷5" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set>

Tween Animation如何使用

使用AnimationUtils類的靜態方法loadAnimation()來加載XML中的動畫XML文件

//main.xml中的ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加載動畫 Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用ImageView顯示動畫 spaceshipImage.startAnimation(hyperspaceJumpAnimation);

如何在Java代碼中定義動畫

//在代碼中定義 動畫實例對象 private Animation myAnimation_Alpha; private Animation myAnimation_Scale; private Animation myAnimation_Translate; private Animation myAnimation_Rotate; //根據各自的構造方法來初始化1個實例對象 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myAnimation_Translate=new TranslateAnimation(30.0f, ⑻0.0f, 30.0f, 300.0f); myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

interpolator的解釋

interpolator定義1個動畫的變化率(the rate of change)。這使得基本的動畫效果(alpha, scale, translate, rotate)得以加速,減速,重復等。

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

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

 

Frame Animation

Frame Animation是順序播放事前做好的圖象,跟電影類似。不同于animation package, Android SDK提供了另外1個類AnimationDrawable來定義、使用Frame Animation。

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

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

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

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

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

然后我們將以上XML保存在res/anim/文件夾下,命名為rocket_thrust.xml,顯示動畫的代碼:

AnimationDrawable rocketAnimation; public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);   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張圖片依照順序的播放1次.

有1點需要強調的是:啟動Frame Animation動畫的代碼rocketAnimation.start();不能在OnCreate()中,由于在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定,在OnCreate()中啟動動畫,就只能看到第1張圖片。這里實在拖曳事件中實現的。

下面,瀏覽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 duration) 為當前動畫增加幀(資源,延續時長)
動畫控制
void start() 開始動畫
void run() 外界不能直接掉調用,使用start()替換
boolean  isRunning() 當前動畫是不是在運行
void stop() 停止當前動畫

 

本文參考:Android SDK

               moandroid.com

                eoeandroid.com

161
分類: Android
綠色通道: 好文要頂 關注我 收藏該文與我聯系 
feisky
關注 - 10
粉絲 - 673
+加關注
14
0
(請您對文章做出評價)
? 上1篇:分享如何求matlab程序的運行時間
? 下1篇:Android網絡連接處理學習筆記

Feedback

#1樓   

2010⑴1⑴0 16:06 by 傳說中的祥哥  
想請教1下樓主,如果是1個實例加載多個動畫,用代碼方式怎樣實現?
例如:
用xml實現漸變加上畫面位置轉換可以用以下:
<?xml version="1.0" encoding="utf⑻"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
>
<alpha
and
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 在线国产高清 | 在线不卡免费视频 | 亚洲综合久久成人69 | 亚洲精品视频在线免费 | 国产精品va在线观看手机版 | 日本爱爱小视频 | 午夜dj影视在线观看免费视频 | 亚洲成年人在线观看 | 国产精品亚洲精品日韩已满 | 一级做a级爰片性色毛片视频 | 国产99视频精品免视看7 | 波多野结衣在线观看一区二区三区 | 精品久久久久久久一区二区手机版 | 91久久精品国产亚洲 | 久久77777| 亚洲 欧美 校园 | 风间由美一区二区av101 | 成人免费一区二区三区在线观看 | 欧美国产成人在线 | 亚洲欧洲无码一区二区三区 | 免费视频网站一级人爱视频 | 91亚洲精品久久 | 可以看的毛片网站 | 精品国产免费第一区二区三区日韩 | 国产三级中文字幕 | 亚洲欧美一级久久精品 | 久久精品免费一区二区视 | 一级做a爱片性色毛片武则天五则 | 欧美成人观看免费全部完小说 | 高清欧美性xxxx成熟 | 免费中文字幕在线国语 | 亚洲video| 免费看叼嘿视频 | 伊人久久大香线蕉75 | 精品国产免费第一区二区三区日韩 | 日韩国产在线观看 | 久久精品女人毛片国产 | 亚洲品质自拍视频网站 | 欧美另类69xxxxx性欧 | 亚洲欧美日韩国产精品久久 | 国产精品va在线观看手机版 |