Android开场动画类完整实现代码
本文所述实例为在android中开起开场动画类,已封装好,进行android开发的朋友可使用。在这个类中,你可以:设置开场动画的图片资源、返回下一个要启动的Activity、显示开场动画、执行耗时的操作、创建启动时的界面Layout、设置屏幕的方向。默认是竖屏、开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度等。
具体实现代码如下:
packagecom.lurencun.cfuture09.androidkit.ui;
importjava.io.Serializable;
importjava.lang.ref.WeakReference;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.content.pm.ActivityInfo;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.ViewGroup.LayoutParams;
importandroid.view.Window;
importandroid.view.WindowManager;
importandroid.view.animation.AlphaAnimation;
importandroid.widget.FrameLayout;
importandroid.widget.ImageView;
importandroid.widget.ImageView.ScaleType;
importcom.lurencun.cfuture09.androidkit.thread.HandlerFactory;
publicabstractclassIntroActivityextendsActivity{
privatestaticfinalStringFLAG_RESOURCE="FLAG_RESOURCE";
/**
*后台任务完成的标志。
*/
privatestaticfinalbyteBACKGROUND_FINISH=0x01;
/**
*前台任务完成的标志。
*/
privatestaticfinalbyteFRONTGROUND_FINISH=0x10;
/**
*表示要播放开场动画。
*/
privatestaticfinalintINTRO_PLAY=0;
/**
*开场动画的资源。
*/
privateList<IntroImgResource>mResources;
/**
*图片背景颜色。默认为白色。
*/
privateintmBackgroundColor=0xFFFFFFFF;
/**
*UI线程。
*/
privateHandlermUiHandler;
/**
*用来显示动画。
*/
privateImageViewmIntroImage;
/**
*屏幕方向。
*/
privateintmOrientation=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
init();
runOnMainThread();
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.setRequestedOrientation(mOrientation);
this.setContentView(createLayout());
setIntroResources(mResources);
startOnBackground();
showIntro();
}
privatevoidinit(){
mResources=newArrayList<IntroImgResource>();
mUiHandler=newUIHandler(this);
}
/**
*设置开场动画的图片资源。
*
*@paramresources
*开场动画的图片资源。
*/
protectedabstractvoidsetIntroResources(List<IntroImgResource>resources);
/**
*返回下一个要启动的Activity。
*
*@return下一个要启动的Activity。
*/
protectedabstractClass<?>nextActivity();
/**
*显示开场动画。
*/
protectedvoidshowIntro(){
intdelayTime=0;
for(finalIntroImgResourceresource:mResources){
Messagemsg=newMessage();
msg.what=INTRO_PLAY;
Bundledata=newBundle();
data.putSerializable(FLAG_RESOURCE,resource);
msg.setData(data);
mUiHandler.sendMessageDelayed(msg,delayTime);
delayTime+=resource.playerTime;
}
mUiHandler.sendEmptyMessageDelayed(FRONTGROUND_FINISH,delayTime);
}
/**
*执行耗时的操作。
*/
privatevoidstartOnBackground(){
HandlerFactory.newHandlerInOtherThread("intro_bg").post(
newRunnable(){
@Override
publicvoidrun(){
runOnBackground();
mUiHandler.sendEmptyMessage(0x1);
}
});
}
/**
*创建启动时的界面Layout。
*
*@return返回创建的界面Layout.
*/
privateViewcreateLayout(){
FrameLayoutlayout=newFrameLayout(this);
ViewGroup.LayoutParamslayoutParams=newViewGroup.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
layout.setLayoutParams(layoutParams);
layout.setBackgroundColor(getBackgroundColor());
mIntroImage=newImageView(this);
FrameLayout.LayoutParamsparams=newFrameLayout.LayoutParams(
FrameLayout.LayoutParams.FILL_PARENT,
FrameLayout.LayoutParams.FILL_PARENT);
params.gravity=Gravity.CENTER;
layout.addView(mIntroImage,params);
returnlayout;
}
/**
*获取图片背景。
*
*@return
*/
publicintgetBackgroundColor(){
returnmBackgroundColor;
}
/**
*设置图片背景。
*
*@parambackgroundColor
*/
publicvoidsetBackgroundColor(intbackgroundColor){
this.mBackgroundColor=backgroundColor;
}
/**
*返回屏幕方向。
*
*@return
*/
publicintgetmOrientation(){
returnmOrientation;
}
/**
*设置屏幕的方向。默认是竖屏。
*
*@parammOrientation
*屏幕方向。ActivityInfo.SCREEN_ORIENTATION_PORTRAIT或者是ActivityInfo.
*SCREEN_ORIENTATION_LANDSCAPE。
*/
publicvoidsetmOrientation(intmOrientation){
this.mOrientation=mOrientation;
}
/**
*在前台中执行的代码。如需对界面进行横屏的重新设置,请此在执行setmOrientation()方法。
*/
protectedvoidrunOnMainThread(){
}
/**
*在后台中执行的代码。在此进行比较耗时的操作。
*/
protectedvoidrunOnBackground(){
}
protectedstaticclassUIHandlerextendsHandler{
/**
*是否需要等待。
*/
privateintisWaiting=0;
privateWeakReference<IntroActivity>activity;
publicUIHandler(IntroActivityactivity){
this.activity=newWeakReference<IntroActivity>(activity);
}
publicvoidhandleMessage(android.os.Messagemsg){
if(msg.what==INTRO_PLAY){
IntroImgResourceresource=(IntroImgResource)msg.getData()
.getSerializable(FLAG_RESOURCE);
AlphaAnimationanimation=newAlphaAnimation(
resource.startAlpha,1f);
animation.setDuration(resource.playerTime);
IntroActivityintro=activity.get();
if(intro!=null){
if(resource.isExpand){
intro.mIntroImage.setScaleType(ScaleType.FIT_XY);
}else{
intro.mIntroImage.setScaleType(ScaleType.CENTER);
}
intro.mIntroImage.setImageResource(resource.mResId);
intro.mIntroImage.startAnimation(animation);
}
return;
}
if(msg.what==BACKGROUND_FINISH||msg.what==FRONTGROUND_FINISH){
isWaiting|=msg.what;
//当后台或前台的任务未完成时,不执行Activity的跳转。
if(isWaiting==(BACKGROUND_FINISH|FRONTGROUND_FINISH)){
IntroActivityintro=activity.get();
if(intro!=null){
intro.startActivity(newIntent(intro,intro
.nextActivity()));
intro.finish();
}
}
}
};
};
/**
*开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度。
*
*@authormsdx
*
*/
protectedclassIntroImgResourceimplementsSerializable{
/**
*序列化ID。
*/
privatestaticfinallongserialVersionUID=-2257252088641281804L;
/**
*资源图片ID.
*/
privateintmResId;
/**
*播放时间,单位为毫秒。
*/
privateintplayerTime;
/**
*开始时的透明程度。0-1之间。
*/
privatefloatstartAlpha;
/**
*图片是否扩展。
*/
privatebooleanisExpand;
/**
*开场动画资源的构造方法。
*
*@parammResId
*图片资源的ID。
*@paramplayerTime
*图片资源的播放时间,单位为毫秒。。
*@paramstartAlpha
*图片资源开始时的透明程度。0-255之间。
*/
publicIntroImgResource(intmResId,intplayerTime,floatstartAlpha,booleanisExpand){
super();
this.mResId=mResId;
this.playerTime=playerTime;
this.startAlpha=startAlpha;
this.isExpand=isExpand;
}
/**
*获取资源图片ID。
*
*@return资源图片ID。
*/
publicintgetmResId(){
returnmResId;
}
/**
*设置资源图片ID.
*
*@parammResId
*要设置的资源图片ID.
*/
publicvoidsetmResId(intmResId){
this.mResId=mResId;
}
/**
*返回资源图片的播放时间。
*
*@return资源图片的播放时间。
*/
publicintgetPlayerTime(){
returnplayerTime;
}
/**
*设置资源图片的播放时间。
*
*@paramplayerTime
*资源图片的播放时间。
*/
publicvoidsetPlayerTime(intplayerTime){
this.playerTime=playerTime;
}
/**
*得到资源开始时的透明程度。
*
*@return
*/
publicfloatgetStartAlpha(){
returnstartAlpha;
}
/**
*设置资源开始时的透明程度。
*
*@paramstartAlpha
*/
publicvoidsetStartAlpha(floatstartAlpha){
this.startAlpha=startAlpha;
}
/**
*返回图片是否设置扩展。
*
*@return
*/
publicbooleanisExpand(){
returnisExpand;
}
/**
*设置图片是否扩展。
*
*@paramisExpand
*如果为true,则图片会被拉伸至全屏幕大小进行展示,否则按原大小展示。
*/
publicvoidsetExpand(booleanisExpand){
this.isExpand=isExpand;
}
}
}
本实例配备了详细的注释说明,读者可以在了解程序代码功能的基础上进行个性化的修改,打造出自己独具个性的Android开场动画!