最近在看 Jammendo代碼,打算將學習過程簡單的記錄下來,下面開始第一篇:
打開Jammendo運行之後,出彈出一個對話框,跳過對話框之後,會有一個淡出界面跳轉到首頁效果的實現。那麼這個效果是怎麼實現的呢,其實就是Animation中動畫淡出的效果——原理大概是layout不透明變成全透明這樣一個原理。
我這裏用到的自定義endAnimation,是執行的動畫效果,這裏找到我事先寫好的fade_out.xml,也就是一個簡單的淡出效果實現:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"
/>
</set>
OK,看完上面的動畫xml文件之後。。下面開始看在Activity中代碼應該如何編寫
在這裏,我利用Handler和Runnable實現簡單的動畫淡出效果,android中動畫效果是基於Animation來實現的,其他複雜的效果這裏就不提了,簡單的說下實現的淡出效果實現
public class SplashscreenActivity extends Activity {
private Animation endAnimation;
private Handler endAnimationHandler;
private Runnable endAnimationRunnable;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splashlayout);
textView = (TextView)this.findViewById(R.id.splashtextview);
endAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
endAnimation.setFillAfter(true);
endAnimationHandler = new Handler();
endAnimationRunnable = new Runnable() {
@Override
public void run() {
findViewById(R.id.splashlayout).startAnimation(endAnimation);
}
};
endAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) { }
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
// HomeActivity.launch(SplashscreenActivity.this);
// SplashscreenActivity.this.finish();
}
});
endAnimationHandler.removeCallbacks(endAnimationRunnable);
endAnimationHandler.postDelayed(endAnimationRunnable, 2000);
}
}
然後利用AnimationUtils.loadAnimation加載編寫好的動畫效果。
在這裏有一個SetFillAfter(true)函數,我搜了一下資料,大概解釋是這樣的:
SetFillAfter()方法用於設置一個動畫執行完畢後,View對象保留在中指的位置,如果設置爲false,表示使能,也就是不會停留在終止位置,在這裏我們設置爲false。
之後定義的一個endAnimationHadler和一個endAnimationRunnable,是具體調用這個動畫的線程
Handler處理多線程的時候通常用Runnable接口,關於這個我也不太懂,就不多提。
endAnimationHandler = new Handler();
endAnimationRunnable = new Runnable() {
public void run() {
findViewById(R.id.splashlayout).startAnimation(endAnimation);
}
};
具體的動畫效果調用將會在endAnimationRunnable的Run()方法中實現,可以看到在run方法中,我利用findViewById找到了一個splashlayout,這個splashlayout是當前activity佈局中layout資源的id,而不是整個xxx.xml文件的id。在之前的過程中,很長時間發現工程無法運行,後來發現我一直用的是R.layout.splashlayout。這裏需要注意,我們添加的不是xml佈局,而是xxx.xml文件中layout資源的id。如下所示:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/splashlayout</span>"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/splashtextview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world"
></TextView>
</LinearLayout>
接下來就是爲endAnimation實現一些onAnimationStart,onAnimationRepeat,onAnimationEnd回調方法,在onAnimationEnd方法中,也就是動畫效果結束之後,我們可以執行一些自定的事件,例如頁面的跳轉等。
上面過程完成之後,就可以調用Hadler來執行我們完成的動畫淡出效果了,代碼如下
<span style="white-space:pre"> </span>endAnimationHandler.removeCallbacks(endAnimationRunnable);
endAnimationHandler.postDelayed(endAnimationRunnable, 2000);
OK,上面就是一個簡單淡出效果的實現,寫於4月6日