Android引導指示層的製做 (ViewStub + SharePreference)

引導指示界面是個什麼鬼東西?一張圖即明瞭:android

 

 

其實就是給剛安裝你的軟件的用戶指示如何使用的一個蒙層,具備如下特色:ide

  • 運行中顯示,用戶使用到特定的環境、特定的界面時才顯示(這裏請區別下第一次安裝時剛啓動時好幾個滑動界面的「引導歡迎頁」)
  • 覆蓋於原來界面之上,而且半透明,帶有指示文字或圖標
  • 軟件生命週期內只出現一次(閱後即焚)
  • 不影響原來軟件的操做

這一個小小的界面實現起來有一些小的訣竅,使用了ViewStub和SharePrefrence,下面一步步展現如何實現。佈局

 

寫佈局ui


 

第一步就是寫出這個展現出來效果的佈局文件,這裏例子很簡單,就是一個全屏的.9半透明黑色圖加上一個白色文字圖片,圖片居中。這一步直接給出代碼。spa

根據你的狀況本身實現本身所須要的佈局。code

 

layout\guide_root_slide_left_right.xmlxml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:clickable="true"
    android:id="@+id/guide_root"
    android:background="@drawable/bg_dark"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img_slide"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

 

使用ViewStubblog


 

爲何使用ViewStub?首先看下咱們的需求,第一是這個頁面是動態根據條件呈現的,第二是它並不重要出現過一次後就再也不需了,由於但願它不要佔多少內存。以此來看,ViewStub就是實現這個引導指示層的最佳控件。生命週期

對於在運行時決定可見性的界面咱們一般的作法是:事件

  1. 在佈局文件中寫好改view或者viewgroup,設置visibility爲gone
  2. 在代碼中根據運行條件將上述view或者viewgroup的可見性設爲visible

這樣子沒什麼不可,可是帶來的問題是之後每次進這個界面,系統都會爲這個view分配內存而且實例化,從而拖慢了速度,耗費資源(事實上咱們只想讓它顯示僅僅一次就不要了)。而ViewStub呢?它是一個輕量級的View,相似於一個佔位符。給他指定一個佈局,它默認並不會inflate出來,直到你想讓它顯示出來的時候纔會inflate你所指定的佈局從而延遲分配了內存(相似於延遲加載)。

 

因爲咱們的半透明指示層是要矇住全屏的,並且才原來的佈局界面之上(佈局樹裏面的控件是寫在上面位置的先展現,寫在下面位置的後展現),因此咱們的原來的根佈局須要爲RelativeLayout,同時在根佈局的最下面寫上ViewStub:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 原來的Activity內容-->
    ...

    <ViewStub
        android:id="@+id/guide_root_slide"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"

        android:layout="@layout/guide_root_slide_left_right"/>

</RelativeLayout>

這裏ViewStub能夠看成是一個普通的View來加入到佈局文件裏面,同時給他的layout參數執行咱們實際想要inflate出來的佈局。等於給佔位符設置一個「目標」。

 

增長邏輯代碼


 

在你的activity代碼中,得到這個ViewStub的引用:

ViewStub stubGuideSlide;

// onCreate
stubGuideSlide = (ViewStub) findViewById(R.id.guide_root_slide);

 

而後寫一個方法,在你的運行判斷邏輯(好比某個按鈕的點擊回調)裏面執行這個方法,這裏寫上僞代碼:

// some on Click listener
...
showGuideSlide();
...



private void showGuideSlide(){

    if(若是第一次到這裏)
        展現GuideSlide引導指示層
    else
        不展現
    
}  

 

如何判斷是否第一次走到這裏呢?咱們能夠用SharePreference,咱們能夠隨便定義屬於這張引導指示層的key,而後判斷他是否存在。若是不存在表示第一次進入,進入後咱們把這個key對應的SharePeference隨便設一個值,下回就不會走到這裏了:(showGuideSlide的完整代碼以下)

private void showGuideSlide() {

        if (SPUtils.contains(mContext, Constant.GuideVisibilityKey.ROOT_FRAGMENT_SLIDE)) {
            return;
        }

        try {
            final View guideSlideView = stubGuideSlide.inflate();
            RelativeLayout rl = (RelativeLayout) guideSlideView.findViewById(R.id.guide_root);
            if (rl != null) {
                rl.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        guideSlideView.setVisibility(View.GONE);
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        SPUtils.put(mContext, Constant.GuideVisibilityKey.ROOT_FRAGMENT_SLIDE, true);
    }

上述代碼須要解釋幾個地方:

  1. SPUtils是我本身寫的一個SharePreference的幫助類,方便設值和檢查是否含有某個key, Constant.GuideVisibilityKey.ROOT_FRAGMENT_SLIDE是這個key的名字
  2. stubGuideSlide.inflate()即通知ViewStub將指定的guide_root_slide_left_right.xml佈局文件給inflate出來,從而展現出引導指示層
  3. 咱們須要讓用戶點擊這個指示層的任意位置後銷燬指示層,因此咱們先獲取佈局的根viewgroup即rl,而後給他設置點擊事件,點擊的時候把ViewStub給Gone掉,這個時候ViewStub就銷燬了。這裏不能直接給ViewStub設置點擊事件,這樣子是沒有效果的,您能夠嘗試一下。
相關文章
相關標籤/搜索