引導指示界面是個什麼鬼東西?一張圖即明瞭: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就是實現這個引導指示層的最佳控件。生命週期
對於在運行時決定可見性的界面咱們一般的作法是:事件
這樣子沒什麼不可,可是帶來的問題是之後每次進這個界面,系統都會爲這個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); }
上述代碼須要解釋幾個地方: