在日常
Android
業(yè)務開發(fā)當中,我們肯定會有關于新手引導的需求圣贸。我們怎么快速實現(xiàn)呢?這里推薦一個快速實現(xiàn)的框架腮恩。
NewbieGuide
這是一款可以通過簡潔鏈式調(diào)用新手引導層的庫,一行代碼實現(xiàn)引導層的顯示,自動判斷首次顯示,當然也可以通過參數(shù)配置來滿足不同的顯示邏輯和需求感混。
NewbieGuide的引入
需要在項目級的build.gradle
加入:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
module的build.gradle
加入:
dependencies {
implementation 'com.github.huburt-Hu:NewbieGuide:v2.4.0'
}
注意這個庫是使用v7
包,如果項目是使用AndroidX
菌仁,是需要自己下載代碼重構的浩习。更多具體的信息請看開源庫wiki
簡單使用
NewbieGuide.with(activity)
.setLabel("guide1")
.addGuidePage(GuidePage.newInstance()
.addHighLight(btnSimple)
.setLayoutRes(R.layout.view_guide_simple))
.show();
高亮View
addHighLight方法有多個重寫静暂,完整參數(shù)如下:
/**
* 添加需要高亮的view
*
* @param view 需要高亮的view
* @param shape 高亮形狀{@link com.app.hubert.guide.model.HighLight.Shape}
* @param round 圓角尺寸济丘,單位dp,僅{@link com.app.hubert.guide.model.HighLight.Shape#ROUND_RECTANGLE}有效
* @param padding 高亮相對view的padding,單位px
* @param relativeGuide 相對于高亮的引導布局
*/
public GuidePage addHighLight(View view, HighLight.Shape shape, int round, int padding, @Nullable RelativeGuide relativeGuide)
高亮區(qū)域
有些情況可能不太容易獲得高亮view的引用,那么此時可以用添加高亮區(qū)域的方式來代替摹迷, 計算出需要高亮的view在anchor中位置疟赊,將獲得的rectF傳入addHighLight方法
/**
* 添加高亮區(qū)域
*
* @param rectF 高亮區(qū)域,相對于anchor view(默認是android.R.id.content)
* @param shape 高亮形狀{@link com.app.hubert.guide.model.HighLight.Shape}
* @param round 圓角尺寸峡碉,單位dp近哟,僅{@link com.app.hubert.guide.model.HighLight.Shape#ROUND_RECTANGLE}有效
* @param relativeGuide 相對于高亮的引導布局
*/
public GuidePage addHighLight(RectF rectF, HighLight.Shape shape, int round, @Nullable RelativeGuide relativeGuide)
顯示次數(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();
引入布局
setLayoutRes
方法,通常其他的類似的庫都是通過代碼參數(shù)來控制說明內(nèi)容展示在高亮view相對的位置未斑。
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, Controller controller) {
TextView tv = view.findViewById(R.id.tv_text);
}
})
引導頁顯示隱藏監(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, Controller controller) {
//引導頁布局填充后回調(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)//退出動畫