在Android應用程序,使用動畫效果,能帶給用戶更好的感覺,做動畫可以通過XML或Android代碼來實現。
Animation動畫效果的實現可以通過兩種方式進行實現,一種是tweened animation (漸變動畫),另一種是frame by frame animation (畫面轉換動畫)。
tweened animation漸變動畫有以下兩種類型:
1.alpha 漸變透明度動畫效果
2.scale 漸變尺寸伸縮動畫效果
frame by frame animation 畫面轉換動畫有以下兩種類型:
1.translate 畫面轉換位置移動動畫效果
2.rotate 畫面轉移旋轉動畫效果
在這裡,我使用XML來做動畫。實現基本的動畫,如淡入,旋轉等。
步驟:1、首先在res目錄中新建anim的文件夾,在anim中新建需要的動畫xml資源文件。
anim/alpha.xml(漸變動畫)
anim/scale.xml(伸縮動畫)
anim/translate.xml(移動動畫)
anim/rotate.xml(旋轉動畫)
2、xml資源文件創建完成之後,接下來就是調用這些資源文件。以alpha為例,先創建AlphaActivity。
在activity_alpha.xml中隨便放一張背景圖片
AlphaActivity.java
package com.example.animation_demo; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.Toast; public class AlphaActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view=View.inflate(this, R.layout.activity_alpha, null); setContentView(view); //使用AnimationUtils類的靜態方法loadAnimation()來加載XML中的動畫XML文件 Animation animation=AnimationUtils.loadAnimation(this, R.anim.alpha); view.startAnimation(animation); animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation arg0) {} //在動畫開始時使用 @Override public void onAnimationRepeat(Animation arg0) {} //在動畫重復時使用 @Override public void onAnimationEnd(Animation arg0) { Toast.makeText(AlphaActivity.this, "在動畫結束時使用", Toast.LENGTH_SHORT).show(); } }); } }
這個是整個layout文件的動畫,也可以讓任何UI元素調用starAnimation方法。
例如:textMsg.startAnimation(animation); 這時候就不需要下面代碼 動畫填充指定xml瞭
View view=View.inflate(this, R.layout.activity_alpha, null); setContentView(view);
直接setContentView(R.layout.activity_alpha); 就OK瞭。卒。
今天剛用到,遲點貼出圖片。。
附上找到的一些基本的xml效果:
Fade In:淡入
alpha是漸變透明度效果,值由0到1
fade_in.xml
Fade Out :淡出
以Fade In剛好相反,值由1到0
fade_out.xml
Cross Fading: 交叉的淡入和淡出
同時使用Fade in和Fade out可以達到交叉的效果
public class CrossfadeActivity extends Activity implements AnimationListener { TextView txtMessage1, txtMessage2; Button btnStart; Animation animFadeIn, animFadeOut; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_crossfade); txtMessage1 = (TextView) findViewById(R.id.txtMessage1); txtMessage2 = (TextView) findViewById(R.id.txtMessage2); btnStart = (Button) findViewById(R.id.btnStart); // load animations animFadeIn = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in); animFadeOut = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_out); // set animation listeners animFadeIn.setAnimationListener(this); animFadeOut.setAnimationListener(this); // button click event btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtMessage2.setVisibility(View.VISIBLE); txtMessage2.startAnimation(animFadeIn); txtMessage1.startAnimation(animFadeOut); } }); } @Override public void onAnimationEnd(Animation animation) { if (animation == animFadeOut) { txtMessage1.setVisibility(View.GONE); } if(animation == animFadeIn){ txtMessage2.setVisibility(View.VISIBLE); } } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } }
BLink:若隱若現
blink.xml
Zoom In:放大
zoom_in.xml
Zoom Out:縮小
Rotate:旋轉
rotate.xml
好長啊。。。既然你們都看到這裡瞭,再多說幾句。。
根節點的屬性:
名稱 |
屬性 |
備註 |
android:shareInterpolator |
是否共享插入器 |
共享時,四個子節點都用一個插入器 |
android:interpolator |
指定一個動畫的插入器 |
使用系統資源 |
android:fillEnabled |
當設置為true時,fillAfter和fill, Befroe將會都為true,此時會忽略fillBefore 和fillAfter兩種屬性 |
|
android:fillAfter |
該動畫轉化是否在動畫結束後被應用 |
boolean |
android:fillBefore |
該動畫轉化是否在動畫開始前被應用 |
boolean |
android:repeatMode |
重復模式 |
“restart” 或者 “reverse” |
android:repeatCount |
重復次數 |
integer |
android:duration |
動畫持續時間 |
integer |
android:startOffset |
動畫時間間隔 |
long |
android:zAdjustment |
定義動畫z order的變換 |
[normal] or [top] or [bottom] |
android:detachWallpaper |
boolean |