可能是最好用的Android引導層庫

今天來推薦一個好用遮罩引導庫岩调,這是我持續(xù)維護了大半年的開源項目写隶。剛完成第一版的時候衣式,我也記錄了文章,并且有幸推薦到了郭霖大神的公眾號:
推薦一個好用小巧的Android引導蒙版(浮層)庫渤愁。第一版的功能還是比較簡單牵祟,在后續(xù)的持續(xù)迭代中,我也新增了好多新功能:fragment支持猴伶,多頁連續(xù)顯示课舍,切換動畫,anchor等∷妫現(xiàn)在的2.x版本相比第一版,包括調(diào)用方式捡需,基本已經(jīng)完全不一樣的办桨。

如果你看過我的上述文章,就知道我為什么創(chuàng)建這個項目站辉。但隨著我的特意關注下呢撞,發(fā)現(xiàn)其實有很多類似的輪子,比較有名的有:GuideView饰剥、Highlight殊霞、TourGuide等等。我也一一下載了這些項目汰蓉,學習它們的源碼绷蹲,分析它們的實現(xiàn)。借鑒這些項目之后,我嘗試吸取各個項目的優(yōu)點祝钢,不斷完善自己的項目比规,以維護項目的方式讓自己成長。

到目前拦英,這個項目擁有大部分上述項目的功能點蜒什,并且使用方式更加簡便。具體如何使用還是看下面的介紹吧~

項目地址

NewbieGuide

導入

項目的build.gradle添加

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

module的build.gradle添加

 dependencies {
      compile 'com.github.huburt-Hu:NewbieGuide:v2.0.1'
}

如果你的項目中使用了appcompat-v7疤估,可以排除此庫對v7的引用灾常,避免版本混淆

 dependencies {
      compile ('com.github.huburt-Hu:NewbieGuide:v2.0.0') {
            exclude group: 'com.android.support'
      }
 }

簡單使用

NewbieGuide.with(activity)
        .setLabel("guide1")
        .addGuidePage(GuidePage.newInstance()
            .addHighLight(btnSimple)
            .setLayoutRes(R.layout.view_guide_simple))
        .show();

通過鏈式調(diào)用,一行代碼即可實現(xiàn)引導層的顯示铃拇,來看下效果:

simple use

其中:

  • with方法可以傳入Activity或者Fragment岗憋,獲取引導頁的依附者。Fragment中使用建議傳入fragment锚贱,內(nèi)部會添加監(jiān)聽仔戈,當依附的Fragment銷毀時,引導層自動消失拧廊。
  • setLabel方法用于設置引導頁的標簽监徘,區(qū)別不同的引導頁,該方法必須調(diào)用設置吧碾,否則會拋出異常凰盔。內(nèi)部使用該label控制引導頁的顯示次數(shù)。
  • addGuidePage方法添加一頁引導頁倦春,這里的引導層可以有多個引導頁户敬,但至少需要一頁。
  • GuidePage即為引導頁對象睁本,表示一頁引導頁尿庐,可以通過.newInstance()創(chuàng)建對象。并通過addHighLight添加一個或多個需要高亮的view呢堰,該方法有多個重載抄瑟,可以設置高亮的形狀,以及padding等(默認是矩形)枉疼。setLayoutRes方法用于引導頁說明布局皮假,就是上圖的說明文字的布局。
  • show方法直接顯示引導層骂维,如果不想馬上顯示可以使用build方法返回一個Controller對象惹资,完成構建。需要顯示得時候再次調(diào)用Controller對象的show方法進行顯示航闺。

顯示次數(shù)控制

通常情況下引導頁只在用戶首次打開app的時候顯示褪测,第二次進入時不顯示,因此默認只顯示一次。當然你也可以通過.setShowCounts(3)自定義顯示的次數(shù)汰扭,調(diào)試的時候可以使用.alwaysShow(true)設置每次都顯示稠肘。

NewbieGuide.with(activity)
        .setLabel("guide1")
        //.setShowCounts(3)//控制次數(shù)
        .alwaysShow(true)//總是顯示,調(diào)試時可以打開
        .addGuidePage(GuidePage.newInstance()
            .addHighLight(btnSimple)
            .setLayoutRes(R.layout.view_guide_simple))
        .show();

就算設置了.alwaysShow(true)萝毛,內(nèi)部還是會記錄顯示得次數(shù)项阴,之后改會setShowCounts(3)可能實際記錄的次數(shù)早已超過限制,因此不會再次顯示笆包。使用Controller對象的resetLabel方法重置次數(shù)环揽。(或者清除應用緩存也能重置次數(shù))

自定義說明布局

著重說明一下setLayoutRes方法,通常其他的類似的庫都是通過代碼參數(shù)來控制說明內(nèi)容展示在高亮view相對的位置庵佣,如下方歉胶。經(jīng)常需要多次運行才能找到滿意的位置的參數(shù)。大多說明內(nèi)容只能出現(xiàn)在高亮的上下左右巴粪,需要庫的支持通今,自定義的程度不是很高。

我所采用的方式是將說明內(nèi)容通過xml的方式肛根,自定義擺放位置辫塌。使得說明內(nèi)容高度自定義,不管你是簡單的圖片派哲,還是對話框類型的都可以臼氨。

like dialog
GuidePage.newInstance()
    .addHighLight(btnDialog)
    .setEverywhereCancelable(false)//是否點擊任意位置消失引導頁,默認true
    .setLayoutRes(R.layout.view_guide_dialog, R.id.btn_ok)
    .setOnLayoutInflatedListener(new OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(View view) {
            TextView tv = view.findViewById(R.id.tv_text);
        }
    })

該方法還有一個可變參數(shù)setLayoutRes(@LayoutRes int resId, int... id)芭届,傳入id數(shù)組表示在布局中點擊讓引導頁消失或者進入下一頁的View(例如储矩,Button ok的id)。
setOnLayoutInflatedListener設置布局填充完成的監(jiān)聽褂乍,當傳入的xml(R.layout.view_guide_dialog)填充完成時會回答調(diào)用該監(jiān)聽持隧,用于初始化自定布局的元素。

背景色

引導頁的背景色不要在xml中設置树叽,通過GuidePage.setBackgroundColor()設置引導頁的背景色舆蝴,不同引導頁可以有不同背景色,默認是0xb2000000题诵,建議設置有透明度的背景色。

anchor

默認的話引導層是添加在DecorView中的层皱,我借鑒了Highlight的anchor概念性锭,可以改變引導層添加到的view,實現(xiàn)局部引導層的顯示叫胖。通過調(diào)用.anchor(view)傳入anchorView草冈,即為引導層的根布局。

final View anchorView = findViewById(R.id.ll_anchor);
 
NewbieGuide.with(FirstActivity.this)
        .setLabel("anchor")                        .anchor(anchorView)
        .alwaysShow(true)//總是顯示,調(diào)試時可以打開
        .addGuidePage(GuidePage.newInstance()                                .addHighLight(btnAnchor, HighLight.Shape.CIRCLE, 5)
                .setLayoutRes(R.layout.view_guide_anchor))
        .show();

這里實現(xiàn)了具體顯示引導層怎棱。

anchor

引導層其實是一個FrameLayout哩俭,設置anchor之后,引導層的大小就與anchor所占的位置相同拳恋。默認是DecorView凡资,即全屏。setLayoutRes方法設置的說明布局則會添加到引導層的FrameLayout中谬运。

引導層顯示隱藏監(jiān)聽

setOnGuideChangedListener添加引導層的顯示隱藏監(jiān)聽隙赁,一個label表示一個引導層,一個引導層可以有多個引導頁梆暖,引導頁切換不會觸發(fā)該監(jiān)聽伞访。

NewbieGuide.with(FirstActivity.this)
    .setLabel("listener")
    .alwaysShow(true)//總是顯示,調(diào)試時可以打開   
    .setOnGuideChangedListener(new OnGuideChangedListener() {
        @Override
        public void onShowed(Controller controller) {
            Toast.makeText(FirstActivity.this, "引導層顯示", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onRemoved(Controller controller) {
            Toast.makeText(FirstActivity.this, "引導層消失", Toast.LENGTH_SHORT).show();
        }
    })
    .addGuidePage(GuidePage.newInstance().addHighLight(btnListener))
    .show();

多頁引導頁與監(jiān)聽

.setOnPageChangedListener(new OnPageChangedListener() {
    @Override
    public void onPageChanged(int page) {
         //引導頁切換轰驳,page為當前頁位置厚掷,從0開始
        Toast.makeText(MainActivity.this, "引導頁切換:" + page, Toast.LENGTH_SHORT).show();
    }
})
.addGuidePage(//添加一頁引導頁
    GuidePage.newInstance()//創(chuàng)建一個實例
       .addHighLight(button)//添加高亮的view
        .addHighLight(tvBottom, HighLight.Shape.RECTANGLE)
        .setLayoutRes(R.layout.view_guide)//設置引導頁布局
        .setOnLayoutInflatedListener(new OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(View view) {
                //引導頁布局填充后回調(diào),用于初始化
                TextView tv = view.findViewById(R.id.textView2);
                tv.setText("我是動態(tài)設置的文本");
            }
        })
    .setEnterAnimation(enterAnimation)//進入動畫
    .setExitAnimation(exitAnimation)//退出動畫
                )
.addGuidePage(
      GuidePage.newInstance()
        .addHighLight(tvBottom, HighLight.Shape.RECTANGLE, 20)
        .setLayoutRes(R.layout.view_guide_custom, R.id.iv)//引導頁布局级解,點擊跳轉(zhuǎn)下一頁或者消失引導層的控件id
       .setEverywhereCancelable(false)//是否點擊任意地方跳轉(zhuǎn)下一頁或者消失引導層冒黑,默認true
        .setBackgroundColor(getResources().getColor(R.color.testColor))//設置背景色,建議使用有透明度的顏色
        .setEnterAnimation(enterAnimation)//進入動畫
        .setExitAnimation(exitAnimation)//退出動畫
    )

引導頁切換動畫

如上面的例子所示蠕趁,還可以添加引導頁的切換動畫

Animation enterAnimation = new AlphaAnimation(0f, 1f);
enterAnimation.setDuration(600);
enterAnimation.setFillAfter(true);

Animation exitAnimation = new AlphaAnimation(1f, 0f);
exitAnimation.setDuration(600);
exitAnimation.setFillAfter(true);
        
GuidePage.setEnterAnimation(enterAnimation)//進入動畫
GuidePage.setExitAnimation(exitAnimation)//退出動畫

更多設置

查看項目的readme

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薛闪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俺陋,更是在濱河造成了極大的恐慌豁延,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腊状,死亡現(xiàn)場離奇詭異诱咏,居然都是意外死亡,警方通過查閱死者的電腦和手機缴挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門袋狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人映屋,你說我怎么就攤上這事苟鸯。” “怎么了棚点?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵早处,是天一觀的道長。 經(jīng)常有香客問我瘫析,道長砌梆,這世上最難降的妖魔是什么默责? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮咸包,結果婚禮上桃序,老公的妹妹穿的比我還像新娘。我一直安慰自己烂瘫,他們只是感情好媒熊,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忱反,像睡著了一般泛释。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温算,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天怜校,我揣著相機與錄音,去河邊找鬼注竿。 笑死茄茁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的巩割。 我是一名探鬼主播裙顽,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宣谈!你這毒婦竟也來了愈犹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤闻丑,失蹤者是張志新(化名)和其女友劉穎漩怎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦嗡,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡勋锤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侥祭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叁执。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矮冬,靈堂內(nèi)的尸體忽然破棺而出谈宛,到底是詐尸還是另有隱情,我是刑警寧澤胎署,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布入挣,位于F島的核電站,受9級特大地震影響硝拧,放射性物質(zhì)發(fā)生泄漏径筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一障陶、第九天 我趴在偏房一處隱蔽的房頂上張望滋恬。 院中可真熱鬧,春花似錦抱究、人聲如沸恢氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勋拟。三九已至,卻和暖如春妈候,著一層夾襖步出監(jiān)牢的瞬間敢靡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工苦银, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啸胧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓幔虏,卻偏偏與公主長得像纺念,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子想括,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容