您的位置:首页 > 移动开发 > Android开发

Splash的实现

2016-06-10 16:53 381 查看


什么是Splash

Splash也就是应用程序启动之前先启动一个画面,上面简单的介绍应用程序的厂商,厂商的LOGO,名称和版本等信息,多为一张图片,显示几秒钟后会自动消息,然后显示出应用程序的主体页面。在PC上,很常见各种平台的应用程序都会有,多半是一张图片显示在屏幕中央,如Microsoft Office系列,或者GIMP等。在各种游戏中Splash是最常见的,几乎所有的游戏开始都会有一张全屏的图片,上面通常都显示厂商的LOGO,游戏的名称等。在手机平板等移动设备上,类似PC的Splash很少,起码对于AndroidiOS来讲原生的应用程序都没有这种Splash,但是不知从何时起,这种Splash开始在第三方应用中流行起来,几乎所有的第三方应用程序都有启动Splash。这些Splash的特点是占满整个屏幕,上面LOGO,厂商的名字,应用的名字版本等,大约3到5秒后,Splash自动消失,应用主页面显示出来。很多应用在Splash页面也显示加载过程。

下面谈谈在Android中如何实现Splash以及它的优缺点:


使用Activity作为Splash

这可能也是最常用的方式,方法就是用一个Activity,给它设置一个背景,或者要显示的信息(厂商,LOGO,名字和版本),让它显示几秒种,然后finish()掉,并启动应用主体Activity。

[html] view
plain copy

 print?

<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>  

[java] view
plain copy

 print?

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之后,再等待数据加载。

[html] view
plain copy

 print?

<?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>  

[java] view
plain copy

 print?

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或使用提示,还不如想想如何简化操作。

切换时的动画请参照:

如何设定Android Activity间切换时的动画

原文:
http://blog.csdn.net/hitlion2008/article/details/7969016
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息