YFAndroidLibs之GuidePageView的用法及源碼解析
關於(About)
GuidePageView故名思意,是指第一次進入應用時的導航頁,效果圖如下:
設計思路及主要接口(Features)
主要的技術點有:
1.自定義抽樣類:GuideAdapter
public abstract class GuideAdapter {
private GuidePageView mGuidePageView;
public abstract List<View> getIndicator();
public abstract List<View> getDisplayView();
public void setGuidePageView(GuidePageView guidePageView){
mGuidePageView=guidePageView;
}
//可擴展
}
其中getIndicator()方法用來設置indicator的圖像信息;getDisplayView()用來設置頁面展示信息;setGuidePageView(GuidePageView guidePageView)主要是在程序中獲取GuidePageView對象,對用戶是不可見的。後期可擴展。
2.在實現了adapter方式後,進一步思考能否簡化程序。adapter的優勢在於程序邏輯清晰,明瞭,可擴展性也高,然而卻有點繁雜,所以進一步封裝出另外一種集成方式:setData(int drawable, int[] imgs),用戶只需要提供一個selector形式的drawable資源,和一組圖片資源,簡單好用。
public void setData(int drawable, int[] imgs){
//圖片數量
lens=imgs.length;
//點
initDots(lens, drawable);
//視圖
initViews(imgs);
vp.setOffscreenPageLimit(3);
vp.setCurrentItem(0);
}
3.在代碼中需要改變設置或者樣式的地方不在少數,有時候顯示設置會顯得臃腫,所以提出使用一個設置類的實體類:GuidePageViewStyle。
/**
* 獲取樣式對象
*/
public GuidePageViewStyle getGuidePageStyle(){
return mGuidePageViewStyle;
}
用戶可以在程序中通過這個方法直接獲取GuidePageViewStyle對象,支持的設置有:
//dot和底部之間的距離
private int dotsHeight;
//按鈕樣式
private int btnStyle=R.drawable.flag_01;
//btn和底部之間的距離
private int btnHeight;
//btn的文字,默認爲“馬上體驗”
private String btnStr="馬上體驗";
4.設置直接點擊跳過事件,調用該方法設置跳轉。
/**
* 設置點擊事件
*/
public void setJumpClick(OnClickListener listener){
}
5.另外:由於GuidePageView一般情況下,只在程序中出現一次,即第一次進入程序的時候。在工作中,一般可以在前一個界面中設置:SharedPreferences。比如:
if(sp.getBoolean("isFirsh", true)==true){
setHotCity();
editor.putBoolean("isFirsh", false);
editor.commit();
//相應的intent,跳轉到GuidePage界面
}else{
//想應的intent,跳轉到其他的常規界面
}
主要暴露接口和設置:
- 設置若干展示圖片;
- 設置dot的樣式;
- 設置點擊按鈕的文字、樣式及位置;
- 設置跳轉監聽器;
- 提供兩種設置數據方式:setData()及setAdapter();
- 在持續更新。
使用
導入包:
詳見我的另外一篇博文:http://blog.csdn.net/u011072613/article/details/53889596
在佈局文件中添加
<com.example.yf_library.guidepage.GuidePageView
android:id="@+id/gp_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
代碼設置:
1.在代碼中設置數據:
方式一:
mGuidePageView.setAdapter(new CustomGuideAdapter());
其中CustomGuideAdapter()繼承了GuideAdapter():
class CustomGuideAdapter extends GuideAdapter{
@Override
public List<View> getIndicator() {
// TODO Auto-generated method stub
dotViews = new ArrayList<View>();
for(int i = 0; i < pics.length; i++){
ImageView iv=(ImageView)LayoutInflater.from(getApplicationContext()).inflate(R.layout.dot_view, null);
ImageView iv01=new ImageView(getApplicationContext());
iv01.setBackgroundResource(R.drawable.dot);
iv01.setLayoutParams(mParams);
mParams.setMargins(20, 20, 20,
20);
dotViews.add(iv);
}
return dotViews;
}
@Override
public List<View> getDisplayView() {
// TODO Auto-generated method stub
views = new ArrayList<View>();
for(int i = 0; i < pics.length; i++){
View view=LayoutInflater.from(getApplicationContext()).inflate(R.layout.img, null);
view.setBackgroundResource(pics[i]);
views.add(view);
}
return views;
}
}
方式二:
mGuidePageView.setData(R.drawable.dot, pics);
其中setData(int resId,int[] pic)的第一個參數是指指示器的源selector資源,第二個參數是指需要展示的若干張圖片數組。
2.設置樣式
guidePageViewStyle=mGuidePageView.getGuidePageStyle();
guidePageViewStyle.setBtnStr("我要進入了");
當然需要記住的是樣式設置的代碼必須在數據設置的前面,這樣才能讓設置生效,不然程序會調用默認的設置。
樣式包括:字體的背景,顏色,什麼字體等等。
3.跳轉監聽:
mGuidePageView.setJumpClick(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mIntent=new Intent(GuidePageViewActivity.this,CommonActivity.class);
startActivity(mIntent);
}
});
大概的方法就這麼多,GuidePageView的程序比SplashView要相對複雜,花去的時間也較多,在最初的時候會出現卡頓,但是經過慢慢調優纔到現在的效果。
該GuidePageView還有很多需要擴展的地方。。。。(比如添加多個動畫界面,將導航換成不同的圖片,而不是單一的設置等),敬請期待。
github:https://github.com/commutescript
歡迎交流,歡迎star。