我們來講個老生常談的話題,估計大家都用過的―>ViewPager,用它來做新手導航頁面,雖然這次也是講這個,但是和以往的用法可能有些不同,大家都看到標題進來的,應該知道的是:動態加載指示器。
什么叫動態加載呢,是不是感覺很高大上呢,其實呢就是動態的去加載指示器的數量的,而不是在布局文件中寫死。希望看了這篇文章大家對ViewPager有新的認識。

看到這個效果大家應該都很不屑吧,今天講這個就是為了讓大家有新的認識。好了,好好聽,開始了。
這個動態加載就是為了動態的加載下面的灰色圓點指示器和紅色圓點指示器,大家有沒有注意到當我滑動的時候(即切換頁面的時候)紅色圓點會跟著移動。沒錯。
第一步:
在布局文件中添加ViewPager,并添加灰色圓點和紅色圓點的布局,先來想想都用什么布局呢,首先三個灰色圓點可以用線性布局,一個紅色圓點可以采用相對布局(原因:其實紅色圓點就是覆蓋在灰色圓點上)
<RelativeLayout android:id="@+id/rl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="30dp" > <!--灰色圓點的布局--> <LinearLayout android:id="@+id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> </RelativeLayout>
第二步:
在onCreate方法中聲明ViewPager和灰色圓點和紅色圓點布局的示例(原因:因為我們需要動態加載圓點),并為ViewPager添加適配器和監聽器。
//ViwePager private ViewPager viewPager; //存放三個灰色圓點的線性布局 private LinearLayout ll; //用來存放紅色圓點和灰色圓點的相對布局 private RelativeLayout rl; //初始化組件 private void initView() { viewPager = (ViewPager) findViewById(R.id.viewPager); imageViews = new ArrayList<ImageView>(); ll = (LinearLayout) findViewById(R.id.ll); rl = (RelativeLayout) findViewById(R.id.rl); btn = (Button) findViewById(R.id.btn); //為ViewPager添加適配器 viewPager.setAdapter(new MyAdapter()); viewPager.setOnPageChangeListener();第三步:
將三個圖片加到ViewPager的適配器中。
注:為了在滑動的時候不重復創建圖片實例,所以我們可以先將需要加載的資源的放在一個集合中,當每次滑動需要加載的時候就從集合中取出即可,這樣節省了系統資源。
//導航頁資源 private int[] images = new int[]{ R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3, }; //用來存放導航圖片實例(保證唯一性,滑動的時候不重復創建) private List<ImageView> imageViews; //初始化導航頁面 for (int i = 0; i < images.length; i++) { ImageView iv = new ImageView(MainActivity.this); iv.setImageResource(images[i]); imageViews.add(iv); } //PagerAdapter有四個方法 class MyAdapter extends PagerAdapter { //返回導航頁的個數 @Override public int getCount() { return images.length; } //判斷是否由對象生成 @Override public boolean isViewFromObject(View view,Object object) { return view == object; } //加載頁面 //ViewGroup:父控件指ViewPager //position:當前子控件在父控件中的位置 @Override public Object instantiateItem(ViewGroup container, int position) { ImageView iv = imageViews.get(position); container.addView(iv); return iv; } //移除頁面 @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }第四步:
重要的部分來了,這一步是動態的將灰色圓點和紅色圓點添加進來,并讓紅色圓點隨著滑動也跟著一起滑動。
首先動態的添加灰色圓點和紅色圓點:
for (int i = 0; i < images.length; i++) { ImageView iv = new ImageView(MainActivity.this); iv.setImageResource(images[i]); imageViews.add(iv); //動態加載灰色圓點 ImageView gray_Iv = new ImageView(this); gray_Iv.setImageResource(R.drawable.grar_circle); LinearLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); //從第二個開始有邊距 if (i > 0) { layoutParams.leftMargin = 20; //注意單位是px } gray_Iv.setLayoutParams(layoutParams); ll.addView(gray_Iv); } //添加紅色圓點 red_Iv = new ImageView(this); red_Iv.setImageResource(R.drawable.red_circle); rl.addView(red_Iv);注:灰色圓點是從第二個開始有左邊距的,為組件動態的設置邊距的話使用布局的LayoutParams(衣服),記住三個灰色圓點使用的是哪個布局就采用那種布局的LayoutParams來進行設置。
下面就是讓紅色圓點隨著ViewPager滑動也跟著一起滑動:
//任何一個組件都可以得到視圖樹 red_Iv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { //視圖完成繪制的時候調用 @Override public void onGlobalLayout() { left = ll.getChildAt(1).getLeft() - ll.getChildAt(0).getLeft(); System.out.println(left); //移除視圖樹的監聽 red_Iv.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); //導航頁滑動的時候調用 //positionOffset:滑動的百分比([0,1}) @Override public void onPageScrolled(int position, float positionOffset, int arg2) { RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) red_Iv.getLayoutParams(); layoutParams.leftMargin = (int) (left * positionOffset + position * left); red_Iv.setLayoutParams(layoutParams); }注:這里需要明白一個概念 主站蜘蛛池模板: 台中市| 民勤县| 霍林郭勒市| 滦平县| 缙云县| 农安县| 石柱| 镇巴县| 满城县| 九江县| 黑水县| 仁怀市| 姜堰市| 麻城市| 惠来县| 尤溪县| 北京市| 彝良县| 长垣县| 聊城市| 融水| 宿州市| 乌兰县| 泗水县| 曲阳县| 长宁区| 江北区| 乳山市| 赣榆县| 西宁市| 吉木乃县| 九龙县| 清水县| 璧山县| 灌云县| 巢湖市| 蓬安县| 车致| 铜鼓县| 淅川县| 应城市|