1.png  

Android動畫有2種,一種是Tween Animation,另一種是Frame Animation,先說說Tween動畫吧。
Tween動畫是對視圖物件中的內容進行一系列簡單的轉換,比如位置的移動,大小的縮放,旋轉,透明度得變化等等。Tween動畫可以寫到一個xml檔中,就像定義佈局檔一樣,當然,也可以寫到android代碼中,不過推薦寫到xml檔中,因為它具備的閱讀性,再使用性大大超過了硬編碼。xml檔放在工程的res/anim目錄中,這個目錄中要包含一個根項目,可以是<scale>,<translate>,<alpha>或者<rotate>,當然,這些元素都可以放到一個動畫集合<set>中,預設情況下,所有的動畫指令都是同時發生的,為了讓他們按順序發生,需要設置一個特殊的屬性 startOffset。

下面定義了一個動畫的集合:

 <?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
 <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="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400"/>
 </set> 
</set> 

這裡解釋一下這段代碼的作用:

 首先是一個動畫的集合set,在這個set中有一個屬性shareInterpolater,如果設置為true,則這個集合下麵所有的子元素都享有同樣的interpolater,api上面是這樣說的: android:shareInterpolator
Boolean. "true" if you want to share the same interpolator among all child elements. 緊跟在這個集合後面的是一個縮放動畫,裡面有一些個屬性,下麵一一介紹:
android:interpolator 屬性:這是值定一個動畫的插入器,有一些常用的插入器:accelerate_decelerate_interpolator加速-減速動畫插入器,顧名思義,就是先加速後減速,accelerate_interpolator加速動畫插入器,decelerate_interpolator減速動畫插入器
android:fromXScale屬性為動畫起始時,x座標上的伸縮尺寸
android:toXScal屬性為動畫結束時,x座標上的伸縮尺寸
android:fromYScale屬性為動畫起始時,y座標上的伸縮尺寸
android:toYScale屬性為動畫結束時,y座標上的伸縮尺寸 關於伸縮尺寸這裡還要囉嗦一下:
也就是上面的四個屬性的值:0.0表示收縮到沒有,1.0表示正常無收縮,值小於1.0表示收縮,值大於1.0表示放大。
android:fillAfter屬性當設置為true時,該動畫轉化在動畫結束後被應用,同理還有android:fillBefore屬性,當設置為true時,該動畫轉化在動畫開始前被應用
android:duration屬性工作表示動畫持續的時間,單為時毫秒
android:pivotX屬性為動畫相對於x座標的起始位置
android:pivotY屬性為動畫相對於y座標的起始位置
這2個屬性有不同的格式表示,如值為50,表示是相對於父類的50%,如值為50%,表示是相對於自己的50%
這裡的50%表示相對於自身x,y座標上的中點位置
緊跟著是一個動畫集合,裡面有縮放和旋轉,這個集合的interpolater為減速動畫插入器
這裡的縮放裡面還有一個屬性,android:startOffset屬性是設置動畫開始的時間,這裡設置700是表示700毫秒之後開始,也就是第一個縮放完成之後開始。
旋轉裡面的屬性跟scale裡面的都差不多,只是旋轉講究的角度。
android:fromDegrees屬性工作表示動畫起始時的角度
android:toDegrees屬性工作表示動畫結束時旋轉的角度,可以大於360度
動畫檔寫好了之後,我們就可以在代碼中調用這個動畫了,先寫一個佈局檔,佈局檔裡面有一個ImageView,然後我們讓這個ImageView做動畫。 
 
 <?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView android:id="@+id/imageView1" android:src="@drawable/duola" android:layout_width="match_parent" android:layout_height
="match_parent">
</ImageView>
 </LinearLayout>
 
然後我們讓這個圖片按照我們xml中指定的動畫運動: 

package com.test.shang; 
import android.app.Activity;
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.TransitionDrawable;
 import android.os.Bundle;
 import android.view.MotionEvent;
 import android.view.animation.Animation;
 import android.view.animation.AnimationSet; 
import android.view.animation.AnimationUtils;
 import android.widget.ImageView;
 public class TestStyle extends Activity {
 AnimationDrawable animationDrawable;
 @Override protected void onCreate (Bundle savedInstanceState) {
 super.onCreate(savedInstanceState); setContentView(R.layout.test); 
ImageView iv = (ImageView) findViewById(R.id.imageView1);
 Animation animation = (AnimationSet) AnimationUtils.loadAnimation(this, R.anim.anim_set);
 iv.setAnimation(animation);
 animation.start(); 
} }

 因為這裡是動畫,不好截圖,所以我就不截圖了,具體效果大家可以試試看。 下麵接著說說Frame Animation吧:也就是幀動畫,可以使用AndroidDrawable來負責幀動畫,同樣它可以在xml檔中很方便的列出所有的幀,按照週期去執行每幀動畫,下麵是一個定義幀動畫的例子:

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
 <item android:drawable="@drawable/register" android:duration="500"/> 
<item android:drawable="@drawable/duola" android:duration="500"/>
 <item android:drawable="@drawable/icon" android:duration="500"/>
 </animation-list> 

這裡定義了幀的名字和每幀的持續時間.
這裡有3幀,通過設置android:oneshot屬性為true,它將會在最後一幀停下來,如果設置為false,它將會迴圈播放,可以把它添加到一個背景中,讓他播放,具體代碼如下:  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:
android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView android:id="@+id/
imageView1" android:layout_width="match_parent" android:layout_height="match_parent">
</ImageView> 
</LinearLayout>

 在代碼裡面設置imageview的背景圖片,然後做動畫:

 package com.test.shang;
 
import android.app.Activity;
 import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.TransitionDrawable;
 import android.os.Bundle;
 import android.view.MotionEvent;
 import android.view.animation.Animation;
 import android.view.animation.AnimationSet;
 import android.view.animation.AnimationUtils; 
import android.widget.ImageView;
 public class TestStyle extends Activity {
 AnimationDrawable animationDrawable; 
@Override protected void onCreate (Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);
 setContentView(R.layout.test); 
ImageView iv = (ImageView) findViewById(R.id.imageView1);
 iv.setBackgroundResource(R.anim.anim_list); 
animationDrawable = (AnimationDrawable) iv.getBackground(); }
@Override public boolean onTouchEvent (MotionEvent event)
 { 
if(event.getAction() == MotionEvent.ACTION_DOWN) {
 animationDrawable.start();
return true; 
} return super.onTouchEvent(event); 
} }
這裡需要注意的是:AnimationDrawable在調用OnCreate的過程中不能調用start(),這是因為AnimationDrawable不能在不完全的視窗上運行,需要一個操作來觸發,如果你想立即播放動畫,沒有必要的交互,你可以在onWindowFocusChanged()方法中調用它,這樣它將會成為視窗焦點。


 package com.test.shang;
 
import android.app.Activity;
 
import android.graphics.Bitmap;
 
import android.graphics.BitmapFactory;
 
import android.graphics.Matrix;
 
import android.graphics.drawable.BitmapDrawable;
 
import android.os.Bundle; 
import android.widget.ImageView;
 
import android.widget.ImageView.ScaleType;
 
import android.widget.LinearLayout;
 
import android.widget.LinearLayout.LayoutParams; 
public class BitmapTest extends Activity {
@Override protected void onCreate (Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
setTitle("測試圖片的縮放和旋轉");
 
LinearLayout layout = new LinearLayout(this); 
//載入需要操作的圖片,這裡是機器貓的圖片
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.duola); 
//獲取這個圖片的寬和高
int width = bitmapOrg.getWidth(); 
int height = bitmapOrg.getHeight();
 
//定義預轉換成的圖片的寬和高 int newWidth = 200; int newHight = 200;
 
//計算縮放率,新尺寸除原尺寸
float scaleWidth = (float)newWidth/width; 
float scaleHeight = (float)newHight/height;
 
//創建操作圖片用的matrix物件
Matrix matrix = new Matrix(); 
//縮放圖片動作
matrix.postScale(scaleWidth, scaleHeight);
 
//旋轉圖片動作 matrix.postRotate(45); //創建新的圖片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);
 
//將上面創建的Bitmap轉換成Drawable物件,使得其可以使用在imageView,imageButton上。
 
BitmapDrawable bitmapDrawable = new BitmapDrawable(resizedBitmap);
 
//創建一個ImageView
ImageView iv = new ImageView(this); 
//將imageView的圖片設置為上面轉換的圖片
iv.setImageDrawable(bitmapDrawable); 
//將圖片居中顯示 iv.setScaleType(ScaleType.CENTER); //將imageView添加到佈局範本中
layout.addView(iv, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
 
//設置為本activity的範本
setContentView(layout); 
} }
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(2) 人氣()