學習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來實現的,其他複雜的效果這裏就不提了,簡單的說下實現的淡出效果實現


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);
	}

}

首先我定義了一個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</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日


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章