什么是splash
splash也就是应用程序启动之前先启动一个画面,上面简单的介绍应用程序的厂商,厂商的logo,名称和版本等信息,多为一张图片,显示几秒钟后会自动消息,然后显示出应用程序的主体页面。在pc上,很常见各种平台的应用程序都会有,多半是一张图片显示在屏幕中央,如microsoft office系列,或者gimp等。在各种游戏中splash是最常见的,几乎所有的游戏开始都会有一张全屏的图片,上面通常都显示厂商的logo,游戏的名称等。在手机平板等移动设备上,类似pc的splash很少,起码对于android和ios来讲原生的应用程序都没有这种splash,但是不知从何时起,这种splash开始在第三方应用中流行起来,几乎所有的第三方应用程序都有启动splash。这些splash的特点是占满整个屏幕,上面logo,厂商的名字,应用的名字版本等,大约3到5秒后,splash自动消失,应用主页面显示出来。很多应用在splash页面也显示加载过程。
下面谈谈在android中如何实现splash以及它的优缺点:
使用activity作为splash
这可能也是最常用的方式,方法就是用一个activity,给它设置一个背景,或者要显示的信息(厂商,logo,名字和版本),让它显示几秒种,然后finish()掉,并启动应用主体activity。
复制代码 代码如下:
<activity android:name=".splashactivity"
android:theme="@android:style/theme.notitlebar.fullscreen"
android:nohistory="true"
android:configchanges="orientation|keyboardhidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
复制代码 代码如下:
public class splashactivity extends activity {
private handler mmainhandler = new handler() {
@override
public void handlemessage(message msg) {
intent intent = new intent(intent.action_main);
intent.setclass(getapplication(), nottomorrowactivity.class);
intent.setflags(intent.flag_activity_new_task);
startactivity(intent);
// overridependingtransition must be called after finish() or startactivity, or it won't work.
overridependingtransition(r.anim.activity_in, r.anim.splash_out);
}
};
@override
public void oncreate(bundle icicle) {
super.oncreate(icicle);
getwindow().setbackgrounddrawableresource(r.drawable.kg);
mmainhandler.sendemptymessagedelayed(0, 5000);
}
// much easier to handle key events
@override
public void onbackpressed() {
}
}
使用activity的优势在于:
容易控制key事件
因为在显示splash的时候,是不应该响应事件的,比如触摸事件,或者back或者menu,因为这是一个单独的activity,所以你可以很容易禁掉这些用户事件,而不必担忧影响其他逻辑,或者担心未及时把它们重新启用。
容易定制
因为它是一个单独的activity,所以你可以把它设置成全屏的,或者没有titlebar的,或者其他什么样式与风格。在实际使用中,几乎所有的splash都设置成了全屏。因为它是单独的activity,所以即使你的应用不是全屏的,也没有关系,因为只把splashactivity设置成了全屏不会对其他activity产生影响。
逻辑与主体逻辑分开,容易维护
如前面二点,因为它是一个单独的activity,所有的splash相关的逻辑都在其中,而与应用主体的activity是分开的,所以splash中的逻辑不会影响到其他的activity,这也更容易修改和维护,因为不会绞在一起相互影响。
使用activity的唯一缺点就是它无法利用splash显示的时间里做数据加载。因为它是一个单独的activity,无法控制其他的activity,并且这时其他activity还未创建。
使用viewswitcher作为splash
这个也可以用作splash。viewswitcher是一个viewgroup,它有二个子view,每次只能显示其中一个。主要做法就是,activity的rootview设置为viewswitcher,把一个布局(如imageview)作为splash作为viewswitcher的第一个子view;再把activity的主体布局作为第二个子view;当activity启动时,先显示作为splash的imageview,过几秒后再显示主体布局。事实上viewswitcher通常用在activity需要加载数据,先显示一个进度条,当有数据时再显示真正的布局。
使用viewswitcher的优势
使用viewswitcher的优势就在于,你可以利用splash的时间来进行数据的加载,这样用户就不必在等待了splash之后,再等待数据加载。
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<viewswitcher xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:inanimation="@anim/activity_in"
android:outanimation="@anim/splash_out">
<imageview android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/kg"
android:scaletype="fitxy"/>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<textview android:id="@+id/header"
style="@style/header_text" />
<textview android:id="@+id/header_tip"
style="@style/task_text" />
<listview android:id="@+id/task_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:footerdividersenabled="true"
android:background="@color/white"/>
</linearlayout>
</viewswitcher>
复制代码 代码如下:
public class nottomorrowactivity extends activity {
protected static final string tag = "notomorrowactivity";
protected static final int msg_show_layout = 10;
private static final int menu_add_task = 0;
private handler mmainhandler = new handler() {
@override
public void handlemessage(message msg) {
switch (msg.what) {
case msg_show_layout:
final viewswitcher container = (viewswitcher) findviewbyid(r.id.view_container);
container.shownext();
imageview view = (imageview) container.getchildat(0);
view.setimageresource(0);
container.removeviewat(0);
msplashing = false;
break;
default:
break;
}
}
};
private boolean msplashing;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
msplashing = true;
setcontentview(r.layout.not_tomorrow_activity);
mmainhandler.sendemptymessagedelayed(msg_show_layout, 5000);
}
@override
public void onbackpressed() {
if (!msplashing) {
super.onbackpressed();
}
}
@override
public boolean oncreateoptionsmenu(menu menu) {
if (msplashing) {
return false;
}
menu.add(0, menu_add_task, 0, r.string.add_hint);
return super.oncreateoptionsmenu(menu);
}
@override
public boolean onprepareoptionsmenu(menu menu) {
if (msplashing) {
return false;
}
return super.onprepareoptionsmenu(menu);
}
}
使用viewswitcher的缺点
要注意事件
必须在显示splash的时候禁止back,menu等事件,然后再在splash结束后把它们重新启用。
没办法全屏
除非主体activity是全屏的,否则没办法让view全屏,然后再设置回。
逻辑绞在一起,难维护
就如上面的禁止和启用事件一样,这些东西都是在activity中,所有的逻辑都在一个activity中,自然难维护和修改,并且易出错。
推荐做法
推荐的做法是不使用splash的,或者最多在应用程序安装后第一次使用,从用户角度来讲,它毫无意义,所以你看android或ios的原生应用中都没有splash之类的东西。应该让应用直接进入正题,让用户立刻进到他最关心的页面。同样,应用使用提示也是无用的东西,真正的优秀的应该是简洁且操作,不用学就会的,而不是搞出一大堆教程或者提示。与其花时间精力搞splash或使用提示,还不如想想如何简化操作。