你的位置:首页 > 操作系统

[操作系统]学习Jammendo代码的心路历程(一)简单的淡出效果实现


  最近在看 Jammendo代码,打算将学习过程简单的记录下来,下面开始第一篇:

  打开Jammendo运行之后,出弹出一个对话框,跳过对话框之后,会有一个淡出界面跳转到首页效果的实现。那么这个效果是怎么实现的呢,其实就是Animation中动画淡出的效果——原理大概是layout不透明变成全透明这样一个原理。

  我这里用到的自定义endAnimation,是执行的动画效果,这里找到我事先写好的fade_out.
<??> <set ="http://schemas.android.com/apk/res/android">   <alpha   android:fromAlpha="1.0"   android:toAlpha="0.0"   android:duration="500"   /> </set> 


  fromAlpha为动画起始透明度,toAlpha是动画结束透明度,duration顾名思义也就是动画持续时间,当然有淡出也会有淡入,编写原理差不多,网上有相关代码,也可以自己去查找一下,很简单。

  OK,看完上面的动画

  在这里,我利用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.  在这里有一个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. 
<LinearLayout  android:layout_width="match_parent"  android:layout_height="match_parent"  android:id="@+id/splashlayout"  ="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日