本文所述实例为在android中开起开场动画类,已封装好,进行android开发的朋友可使用。在这个类中,你可以:设置开场动画的图片资源、返回下一个要启动的activity、显示开场动画、执行耗时的操作、创建启动时的界面layout、设置屏幕的方向。默认是竖屏、开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度等。
具体实现代码如下:
package com.lurencun.cfuture09.androidkit.ui; import java.io.serializable; import java.lang.ref.weakreference; import java.util.arraylist; import java.util.list; import android.app.activity; import android.content.intent; import android.content.pm.activityinfo; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.gravity; import android.view.view; import android.view.viewgroup; import android.view.viewgroup.layoutparams; import android.view.window; import android.view.windowmanager; import android.view.animation.alphaanimation; import android.widget.framelayout; import android.widget.imageview; import android.widget.imageview.scaletype; import com.lurencun.cfuture09.androidkit.thread.handlerfactory; public abstract class introactivity extends activity { private static final string flag_resource = "flag_resource"; /** * 后台任务完成的标志。 */ private static final byte background_finish = 0x01; /** * 前台任务完成的标志。 */ private static final byte frontground_finish = 0x10; /** * 表示要播放开场动画。 */ private static final int intro_play = 0; /** * 开场动画的资源。 */ private list<introimgresource> mresources; /** * 图片背景颜色。默认为白色。 */ private int mbackgroundcolor = 0xffffffff; /** * ui线程。 */ private handler muihandler; /** * 用来显示动画。 */ private imageview mintroimage; /** * 屏幕方向。 */ private int morientation = activityinfo.screen_orientation_portrait; @override protected void oncreate(bundle savedinstancestate) { 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(); } private void init() { mresources = new arraylist<introimgresource>(); muihandler = new uihandler(this); } /** * 设置开场动画的图片资源。 * * @param resources * 开场动画的图片资源。 */ protected abstract void setintroresources(list<introimgresource> resources); /** * 返回下一个要启动的activity。 * * @return 下一个要启动的activity。 */ protected abstract class<?> nextactivity(); /** * 显示开场动画。 */ protected void showintro() { int delaytime = 0; for (final introimgresource resource : mresources) { message msg = new message(); msg.what = intro_play; bundle data = new bundle(); data.putserializable(flag_resource, resource); msg.setdata(data); muihandler.sendmessagedelayed(msg, delaytime); delaytime += resource.playertime; } muihandler.sendemptymessagedelayed(frontground_finish, delaytime); } /** * 执行耗时的操作。 */ private void startonbackground() { handlerfactory.newhandlerinotherthread("intro_bg").post( new runnable() { @override public void run() { runonbackground(); muihandler.sendemptymessage(0x1); } }); } /** * 创建启动时的界面layout。 * * @return 返回创建的界面layout. */ private view createlayout() { framelayout layout = new framelayout(this); viewgroup.layoutparams layoutparams = new viewgroup.layoutparams( layoutparams.fill_parent, layoutparams.fill_parent); layout.setlayoutparams(layoutparams); layout.setbackgroundcolor(getbackgroundcolor()); mintroimage = new imageview(this); framelayout.layoutparams params = new framelayout.layoutparams( framelayout.layoutparams.fill_parent, framelayout.layoutparams.fill_parent); params.gravity = gravity.center; layout.addview(mintroimage, params); return layout; } /** * 获取图片背景。 * * @return */ public int getbackgroundcolor() { return mbackgroundcolor; } /** * 设置图片背景。 * * @param backgroundcolor */ public void setbackgroundcolor(int backgroundcolor) { this.mbackgroundcolor = backgroundcolor; } /** * 返回屏幕方向。 * * @return */ public int getmorientation() { return morientation; } /** * 设置屏幕的方向。默认是竖屏。 * * @param morientation * 屏幕方向。activityinfo.screen_orientation_portrait或者是activityinfo. * screen_orientation_landscape。 */ public void setmorientation(int morientation) { this.morientation = morientation; } /** * 在前台中执行的代码。如需对界面进行横屏的重新设置,请此在执行setmorientation()方法。 */ protected void runonmainthread() { } /** * 在后台中执行的代码。在此进行比较耗时的操作。 */ protected void runonbackground() { } protected static class uihandler extends handler { /** * 是否需要等待。 */ private int iswaiting = 0; private weakreference<introactivity> activity; public uihandler(introactivity activity) { this.activity = new weakreference<introactivity>(activity); } public void handlemessage(android.os.message msg) { if (msg.what == intro_play) { introimgresource resource = (introimgresource) msg.getdata() .getserializable(flag_resource); alphaanimation animation = new alphaanimation( resource.startalpha, 1f); animation.setduration(resource.playertime); introactivity intro = 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)) { introactivity intro = activity.get(); if (intro != null) { intro.startactivity(new intent(intro, intro .nextactivity())); intro.finish(); } } } }; }; /** * 开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度。 * * @author msdx * */ protected class introimgresource implements serializable { /** * 序列化id。 */ private static final long serialversionuid = -2257252088641281804l; /** * 资源图片id. */ private int mresid; /** * 播放时间,单位为毫秒。 */ private int playertime; /** * 开始时的透明程度。0-1之间。 */ private float startalpha; /** * 图片是否扩展。 */ private boolean isexpand; /** * 开场动画资源的构造方法。 * * @param mresid * 图片资源的id。 * @param playertime * 图片资源的播放时间,单位为毫秒。。 * @param startalpha * 图片资源开始时的透明程度。0-255之间。 */ public introimgresource(int mresid, int playertime, float startalpha, boolean isexpand) { super(); this.mresid = mresid; this.playertime = playertime; this.startalpha = startalpha; this.isexpand = isexpand; } /** * 获取资源图片id。 * * @return 资源图片id。 */ public int getmresid() { return mresid; } /** * 设置资源图片id. * * @param mresid * 要设置的资源图片id. */ public void setmresid(int mresid) { this.mresid = mresid; } /** * 返回资源图片的播放时间。 * * @return 资源图片的播放时间。 */ public int getplayertime() { return playertime; } /** * 设置资源图片的播放时间。 * * @param playertime * 资源图片的播放时间。 */ public void setplayertime(int playertime) { this.playertime = playertime; } /** * 得到资源开始时的透明程度。 * * @return */ public float getstartalpha() { return startalpha; } /** * 设置资源开始时的透明程度。 * * @param startalpha */ public void setstartalpha(float startalpha) { this.startalpha = startalpha; } /** * 返回图片是否设置扩展。 * * @return */ public boolean isexpand() { return isexpand; } /** * 设置图片是否扩展。 * * @param isexpand * 如果为true,则图片会被拉伸至全屏幕大小进行展示,否则按原大小展示。 */ public void setexpand(boolean isexpand) { this.isexpand = isexpand; } } }
本实例配备了详细的注释说明,读者可以在了解程序代码功能的基础上进行个性化的修改,打造出自己独具个性的android开场动画!
如对本文有疑问, 点击进行留言回复!!
Xamarin 安卓 相机 各种坑 目标API Android 6以后,我选的目标API版本是 Android 10
Android 9.0+软件某些功能突然暴毙:cleartext not permitted
Android : Resource is not a Drawable (color or path)
Flutter问题集锦——Android Studio 4.0.1 在AVD Manger中启动模拟器报“unable to locate abd”
网友评论