服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android开发笔记之:Splash的实现详解

Android开发笔记之:Splash的实现详解

2021-01-17 16:48Android开发网 Android

本篇文章是对Android中Splash的实现进行了详细的分析介绍,需要的朋友参考下

什么是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() {
    }
}



Android开发笔记之:Splash的实现详解

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



Android开发笔记之:Splash的实现详解

使用viewswitcher的缺点
要注意事件

必须在显示splash的时候禁止back,menu等事件,然后再在splash结束后把它们重新启用。
没办法全屏
除非主体activity是全屏的,否则没办法让view全屏,然后再设置回。
逻辑绞在一起,难维护
就如上面的禁止和启用事件一样,这些东西都是在activity中,所有的逻辑都在一个activity中,自然难维护和修改,并且易出错。
推荐做法
推荐的做法是不使用splash的,或者最多在应用程序安装后第一次使用,从用户角度来讲,它毫无意义,所以你看android或ios的原生应用中都没有splash之类的东西。应该让应用直接进入正题,让用户立刻进到他最关心的页面。同样,应用使用提示也是无用的东西,真正的优秀的应该是简洁且操作,不用学就会的,而不是搞出一大堆教程或者提示。与其花时间精力搞splash或使用提示,还不如想想如何简化操作。

延伸 · 阅读

精彩推荐