學習Jammendo代碼的心路曆程(一)簡單的淡出效果實現,jammendo心路曆程
最近在看 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>
fromAlpha為動畫起始透明度,toAlpha是動畫結束透明度,duration顧名思義也就是動畫期間,當然有淡出也會有淡入,編寫原理差不多,網上有相關代碼,也可以自己去尋找一下,很簡單。
OK,看完上面的動畫xml檔案之後。。下面開始看在Activity中代碼應該如何編寫
在這裡,我利用Handler和Runnable實現簡單的動畫淡出效果,android中動畫效果是基於Animation來實現的,簡單的說下實現的淡出效果實現
1 public class SplashscreenActivity extends Activity { 2 private Animation endAnimation; 3 private Handler endAnimationHandler; 4 private Runnable endAnimationRunnable; 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 // TODO Auto-generated method stub 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.splashlayout); 10 endAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);11 endAnimation.setFillAfter(true);12 13 endAnimationHandler = new Handler();14 endAnimationRunnable = new Runnable() {15 @Override16 public void run() {17 findViewById(R.id.splashlayout).startAnimation(endAnimation);18 }19 };20 21 endAnimation.setAnimationListener(new AnimationListener() {22 @Override23 public void onAnimationStart(Animation animation) { }24 25 @Override26 public void onAnimationRepeat(Animation animation) { }27 28 @Override29 public void onAnimationEnd(Animation animation) {30 // HomeActivity.launch(SplashscreenActivity.this);31 // SplashscreenActivity.this.finish();32 }33 });34 35 endAnimationHandler.removeCallbacks(endAnimationRunnable);36 endAnimationHandler.postDelayed(endAnimationRunnable, 2000);37 }38 39 }SplashScreenActivity 首先我定義了一個endAnimation,endAnimation是執行的動畫效果,這裡找到我事先寫好的fade_out.xml,也就是一個簡單的淡出效果實現,然後利用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" 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來執行我們完成的動畫淡出效果了,代碼如下:
endAnimationHandler.removeCallbacks(endAnimationRunnable); endAnimationHandler.postDelayed(endAnimationRunnable, 2000);
OK,上面就是一個簡單淡出效果的實現,寫於4月6日