導航界面(圖檔下方帶選中時變顔色的點點):
首先:
1.需要一個view的list
2.需要一個PagerAdapter
重寫Adapter中的4個方法:
class pageAdapter extends PagerAdapter{
@Override
public int getCount() {
return guildList.size();
}
/**
*
* @param view
* @param object
* @return 傳回項決定是否顯示界面 ,起到過濾和判斷的作用
*/ 如果改成true則所有界面都顯示,如果改成false則都不顯示。
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
//移除
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
//加載界面
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view= guildList.get(position);
container.addView(view);
return view;
}
}
實作了Adapter之後開始實作下方的圓點:
下方的圓點可以采用一個布局容器,然後添加view到布局中實作4個圓點!
布局容器就用LinearLayout,通過給view添加圓點的背景圖檔(通過圖檔選擇器來實作圖檔顔色的切換)實作圓點。
View viewPoint =new View(this);
viewPoint.setBackgroundResource(R.drawable.gray_point);
//給點設定放置的位置
LinearLayout.LayoutParams ll= new LinearLayout.LayoutParams(40,40);//這裡給圓點設定大小是通過LayoutParams的!是所在布局類型的LayoutPararams
//點之間設定間距
if(i==0){}
else{
ll.leftMargin=10; //左邊距
}
viewPoint.setLayoutParams(ll);
llPoints.addView(viewPoint);
灰點的xml繪圖檔案:
drawable目錄下。
<根元素為shape>
<conters :角
<radius :半徑
<solid : 固體 顔色等
注意:
設定寬高在LayoutParams構造器參數裡, 直接寫機關是px, 不是 dp!!!
這裡需要處理!
最後完成事件:
給viewPager設定事件重寫三個方法:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
/**
* 頁面滑動過程中執行
* @param position 目前位置
* @param positionOffset 偏移比例
* @param positionOffsetPixels
*/
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//計算距離滑動紅點
RelativeLayout.LayoutParams rl = (RelativeLayout.LayoutParams) redpoint.getLayoutParams();
//設定紅點在布局中的有邊距
rl.leftMargin= (int) (distens*(positionOffset+position));
redpoint.setLayoutParams(rl);
}
/**
* 目前頁面執行方法
* @param position
*/
@Override
public void onPageSelected(int position) {
if(position==guildList.size()-1){
finishButton.setVisibility(View.VISIBLE);
}else {
finishButton.setVisibility(View.GONE);
}
/*RelativeLayout.LayoutParams rl = (RelativeLayout.LayoutParams) redpoint.getLayoutParams();
//設定紅點在布局中的有邊距
rl.leftMargin= distens*position;
redpoint.setLayoutParams(rl);*/
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
其中onPageSelected();
這個方法是目前頁面的方法是以我們可以對目前頁面做一些處理,比如改變目前頁面圓點的顔色,或者控制目前頁面的按鈕是否顯示等!
如果隻需要滑動時紅點相應改變成選中的顔色則:
public void onPageSelected(int position) {
RelativeLayout.LayoutParams rl = (RelativeLayout.LayoutParams) redpoint.getLayoutParams();
rl.leftMargin= distens*position;
redpoint.setLayoutParams(rl);
}
或者直接在此設定目前點顔色是紅色,其他點顔色是灰色的。
如果想要出現看到點的移動效果:
1.就在普通點的布局中單獨添加一個view(紅顔色背景的點)覆寫住原來的點。
2.onPageScrolled()方法是在滑動時執行的,是以如果我們想在滑動時處理圓點的移動比例顯示,需要這個方法。
2.1而移動的比例需要計算圓點和圓點之間的距離!注意:這個距離不是間距,而是左上角的點到第二個圓點左上角的點之間的距離。
是以這個距離需要界面完成繪制之後才能通過界面的參數确定下來。
2.2:通過監聽布局完成後的函數來确定點與點之間的距離:
redpoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//取消注冊隻監聽一次
redpoint.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//擷取距離
distens= llPoints.getChildAt(1).getLeft()-llPoints.getChildAt(0).getLeft();
}
});
因為布局每進行一次重繪都會調用該函數,是以要取消監聽隻執行一次回調方法!
2.3 在onPageScrolled()方法中根據移動的比例改變紅點的移動距離:
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//計算距離滑動紅點
RelativeLayout.LayoutParams rl = (RelativeLayout.LayoutParams) redpoint.getLayoutParams();
//設定紅點在布局中的有邊距
rl.leftMargin= (int) (distens*(positionOffset+position));
redpoint.setLayoutParams(rl);
}
通過上面的方法即可完成一個導航的viewPager。這很簡單,其中需要的主要是動态添加view控件時布局參數,和點與點之間通過回調函數計算的部分!!