亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android筆記之:App應用之啟動界面SplashActivity的使用

2020-04-11 12:26:49
字體:
來源:轉載
供稿:網友

當前比較成熟一點的應用基本上都會在進入應用之顯示一個啟動界面.
這個啟動界面或簡單,或復雜,或簡陋,或華麗,用意不同,風格也不同.
下面來觀摩幾個流行的應用的啟動界面.

1. 貨比三家
以騰訊qq,新浪weibo,UC瀏覽器,游戲神廟逃亡等7個應用為例,比比看:

(我認為最精美的界面應該是qq2012,雖然只有一張圖,基本的應用名稱,版本,圖標這些信息都有,但是看著舒服,覺得美.)

2. 元素
啟動界面的本意是以友好用戶界面來掩飾后臺緩沖加載,讓用戶用平和等待的心情進入正常應用界面.
但是因為啟動界面是放在開始,在這個特殊的點上,可以做更多的事情,如應用宣傳,顯示版權,展示廣告等等.
所以,這個啟動界面的元素,可多可少,就看你的用意和需求.
下面我把一些常見的元素羅列出來:
(1). 應用名稱
(2). 應用版本
(3). 應用圖標
(4). 版權
(5). 一句話描述
(6). 進度條
(7). 額外信息,如市場專版,獨家首發等
... ...

3. 優點
啟動界面綜合考慮,至少有這些優點可以利用:
(1). 友好的等待界面,這是最基本的
(2). 應用的基本說明,宣傳介紹
(3). 動態的廣告,全屏廣告
(4). 應用的屬性說明如版本,版權等信息,知曉用戶當前應用的基本屬性
從技術的角度細看,還有如下:
(5). 加載耗時資源
(6). 檢查新版本
(7). 預設條件
(8). 代碼分離
... ...

4. 布局
把能加的元素都加進去,做一個無設計的啟動界面,布局如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff">
    <TextView android:id="@+id/copy_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="12dip"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:text="by xxxxx 出品"
        android:textSize="11sp"/>
    <RelativeLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_centerInParent="true">
            <RelativeLayout android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal">
                <ImageView android:id="@+id/jay_studio_icon"
                    android:layout_width="110dip"
                    android:layout_height="130dip"
                    android:src="@drawable/app_jay"/>
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/jay_studio_icon"
                    android:src="@drawable/icon"/>
            </RelativeLayout>
            <LinearLayout android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal">
                <TextView android:id="@+id/app_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="6dip"
                    android:text="@string/app_name"
                    android:textSize="24sp"/>
                <TextView android:id="@+id/version_name"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:gravity="bottom"
                    android:paddingBottom="6dip"
                    android:textSize="14sp"/>
            </LinearLayout>
            <View android:layout_width="fill_parent"
                android:layout_height="1px"
                android:layout_marginLeft="20dip"
                android:layout_marginRight="20dip"
                android:background="#dddddd"/>
            <TextView android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:padding="6dip"
                android:text="@string/setting_about_description"
                android:textSize="13sp"/>
            <ProgressBar android:id="@+id/refresh_list_footer_progressbar"
                android:layout_width="24dip"
                android:layout_height="24dip"
                android:indeterminateDrawable="@anim/app_refresh_progress"
                android:layout_gravity="center">
            </ProgressBar>
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout>

這個布局僅表示意,效果如下:

5. 代碼分離
專門拿這一點出來強調,是為了增強寫程序的代碼分離意識,減少雜糅.
比如說檢查新版本這個操作,
如果放在主界面中,就容易把本來是一個獨立的操作和加載數據的操作混在一起,增加了主界面代碼的復雜度,
如果放啟動界面中,就會顯得更干凈更清晰的在啟動模塊中檢測(因為檢測新版本本來就是應該在應用啟動的時候執行),而且還可以考慮是否允許用戶進入主界面(當你決定完全放棄老版本的時候,有時需要強制用戶升級到新版本)。
其他的一些操作,通過如此考慮,也可能會優化到代碼結構。

6. 異步執行任務
在啟動界面友好展示的同時,后臺可以做很多操作,這些后臺操作可以使用AsyncTask來最簡單的實現。
其他的方法也可以,但是我覺得這時候AsyncTask最簡潔了,這個時候不用AsyncTask什么時候用AsyncTask。

復制代碼 代碼如下:

public class SplashActivity extends BaseActivity {

    private static final int FAILURE = 0; // 失敗
    private static final int SUCCESS = 1; // 成功
    private static final int OFFLINE = 2; // 如果支持離線閱讀,進入離線模式

    private TextView mVersionNameText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        mVersionNameText = (TextView) findViewById(R.id.version_name);
        mVersionNameText.setText(BaseApplication.mVersionName);

        ... ...
        new AsyncTask<Void, Void, Integer>() {

            @Override
            protected Integer doInBackground(Void... params) {
                int result;
                ... ...
                result = loadingCache();
                ... ...
                return result;
            }

            @Override
            protected void onPostExecute(Integer result) {

            };
        }.execute(new Void[]{});
    }

    private int loadingCache() {
        if (BaseApplication.mNetWorkState == NetworkUtils.NETWORN_NONE) {
            return OFFLINE;
        }
        ... ...
        return SUCCESS;
    }

}

把后臺的操作全部放到doInBackground方法中去,最后返回三種狀態,作為后臺執行的結果.

7. 跳轉動畫
在onPostExecute方法中,我們一定會最終要跳轉到另外一個activity,并且把自己finish掉的。
這個跳轉的動畫,在我的手機默認是左右滑進滑出的,其實這個動畫是可以自定義的,比如使用淡入淡出的跳轉動畫。
首先,定義淡入淡出的兩個動畫fade_in.xml和fade_out.xml放到res/anim文件夾中:

復制代碼 代碼如下:

<!--fade_in.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="500" />
</set>

<!--fade_out.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="500" />
</set>

然后,在finish之后調用overridePendingTransition方法使用上面的動畫文件:
復制代碼 代碼如下:

@Override
protected void onPostExecute(Integer result) {
    // ... ...
    Intent intent = new Intent();
    intent.setClassName(SplashActivity.this, getString(R.string.splash_out_activity));
    startActivity(intent);
    finish();
    //兩個參數分別表示進入的動畫,退出的動畫
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
};

8. 最短顯示時間
在實際工作中,發現一個小問題,有可能這個后臺操作用時很短,這樣直接跳轉的話,太快導致有一種閃一下的感覺,所以我們需要定義一個最短顯示時間,取值800ms.
復制代碼 代碼如下:

private static final int SHOW_TIME_MIN = 800;
// ... ...
{
        @Override
        protected Integer doInBackground(Void... params) {
            int result;
            long startTime = System.currentTimeMillis();
            result = loadingCache();
            long loadingTime = System.currentTimeMillis() - startTime;
            if (loadingTime < SHOW_TIME_MIN) {
                try {
                    Thread.sleep(SHOW_TIME_MIN - loadingTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
}

這樣跳轉的時候,就永遠不會有閃的感覺,但是800ms又是很短的一個時間,不會對用戶體驗造成干擾.

9. 小結
啟動界面是一個比較簡單的話題,針對一些碰到的問題,本文做了一個小小的整理,以作記錄.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爱啪在线线免费观看| 日韩美女免费视频| 伊人久久免费视频| 中文字幕亚洲综合久久筱田步美| 欧美在线中文字幕| 欧美精品生活片| 亚洲欧美三级在线| 色综合亚洲精品激情狠狠| www.xxxx欧美| 亚洲精品www久久久久久广东| xvideos亚洲| 97在线观看免费高清| 精品美女永久免费视频| 欧美成人在线网站| 欧美成人四级hd版| 亚洲国产成人av在线| 亚洲精品电影网站| 日韩电影免费观看中文字幕| 午夜精品理论片| 欧美激情综合亚洲一二区| 亚洲qvod图片区电影| 日本不卡免费高清视频| 国产精品视频yy9099| 欧美精品videosex牲欧美| 国产精品99久久久久久人| 国产精品美女免费| 亚洲新中文字幕| 欧美高清性猛交| 黄色一区二区在线| 日韩亚洲第一页| yw.139尤物在线精品视频| 日韩国产精品亚洲а∨天堂免| 亚洲www视频| 国产精品视频公开费视频| 欲色天天网综合久久| 欧美在线日韩在线| 4438全国成人免费| 91免费高清视频| 91在线观看免费观看| 国产裸体写真av一区二区| 亚洲综合日韩在线| 国产精品va在线| 国产精品丝袜久久久久久不卡| 亚洲人成在线观| 欧美壮男野外gaytube| 日韩在线一区二区三区免费视频| 日韩成人在线观看| 国产精品日韩一区| 日韩精品一区二区三区第95| 2020久久国产精品| 性欧美暴力猛交69hd| 日本不卡免费高清视频| 日韩高清av一区二区三区| 色天天综合狠狠色| 亚洲性线免费观看视频成熟| 国产精品伦子伦免费视频| 国产精品网站入口| 精品高清一区二区三区| 久久久国产精品亚洲一区| 一本一本久久a久久精品综合小说| www.亚洲一区| 欧美大人香蕉在线| 91人人爽人人爽人人精88v| 精品亚洲国产视频| 91av免费观看91av精品在线| 国产成人啪精品视频免费网| 国产精品91在线观看| 欧美成人午夜激情| 欧美成人高清视频| 性欧美xxxx交| 日韩亚洲精品视频| 日韩麻豆第一页| 国产精品99久久久久久www| xx视频.9999.com| 亚洲性生活视频在线观看| 国产精品久久久久av免费| 一区二区三区久久精品| 一区二区三区在线播放欧美| 国产福利视频一区| www.99久久热国产日韩欧美.com| 国产精品人成电影在线观看| 国产成人欧美在线观看| 国产午夜精品视频免费不卡69堂| 日韩在线精品视频| 国外色69视频在线观看| 欧美成年人网站| 中文字幕久热精品视频在线| 亚洲自拍中文字幕| 欧美日韩成人精品| 亚洲免费视频一区二区| 亚洲女在线观看| 91精品中国老女人| 亚洲欧美精品一区二区| 亚洲激情小视频| 欧美日韩福利电影| 欧美激情在线观看视频| 欧美亚洲第一区| 欧美国产高跟鞋裸体秀xxxhd| 亚洲福利在线看| 91最新国产视频| 蜜月aⅴ免费一区二区三区| 日韩在线观看网站| 91情侣偷在线精品国产| 亚洲欧美日本另类| 蜜臀久久99精品久久久无需会员| 午夜免费在线观看精品视频| 中文在线资源观看视频网站免费不卡| 精品调教chinesegay| 国产精品视频男人的天堂| 欧美黄色三级网站| 亚洲a在线观看| 亚洲视频一区二区三区| 在线视频亚洲欧美| 国产精品欧美日韩| 午夜精品在线观看| 91成人国产在线观看| 国产91热爆ts人妖在线| 国产一区玩具在线观看| 久久韩剧网电视剧| 亚洲欧洲视频在线| 69视频在线播放| 午夜精品在线视频| 亚洲欧洲国产伦综合| 日本精品视频在线播放| 亚洲欧美国产一本综合首页| 亚洲精选在线观看| 欧美疯狂做受xxxx高潮| 午夜伦理精品一区| 91青草视频久久| 8090理伦午夜在线电影| 欧美精品在线免费播放| 欧美成人性色生活仑片| 国产在线观看精品| 日韩视频免费大全中文字幕| 久久精品美女视频网站| 91精品国产91久久久久久吃药| 日韩欧美高清视频| 亚洲系列中文字幕| 亚洲国产三级网| 久久视频在线直播| 精品久久香蕉国产线看观看亚洲| 一本色道久久88综合日韩精品| 国产日韩换脸av一区在线观看| 色综合视频一区中文字幕| 国产精品专区第二| 日韩精品免费在线视频| 日韩av一区在线| 4438全国亚洲精品在线观看视频| 成人信息集中地欧美| 国产欧美va欧美va香蕉在线| 国产一区二区三区日韩欧美| 亚洲欧美日韩中文在线制服| 亚洲福利视频久久| 国产一区二区三区三区在线观看| 亚洲精品国产综合久久| 欧美午夜激情视频| 久久久久久久久电影| 亚洲男女自偷自拍图片另类| 精品久久国产精品| 国产专区精品视频| 中文字幕在线亚洲| 久久视频在线视频| 18久久久久久| 亚洲视频日韩精品|