Viewpager + 小点点导航的具体实现

Viewpager + 小点点导航的具体实现

 

Viewpager来实现广告展示效果肯定是不错的,配上小点点的分页导航肯定是标配,那么现在就来说一说具体是怎么样来实现的呢?


我们先看看效果图:

    

写完成之后觉得是非常简单的,实现的方式肯定也有很多种,那么我使用的其实是viewpager + viewgroup + view即可。Viewpager负责广告滑动,而viewgroup+ view则是负责下面的小点点导航。

 一、首先看他的布局文件

我们先看看布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="UselessParent" >
 
   <android.support.v4.view.ViewPager
        android:id="@+id/guidePages"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/scrollview" />
 
   <LinearLayout
        android:id="@+id/viewGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:layout_marginBottom="5dp"
        >
   </LinearLayout>
 
</RelativeLayout>

布局简单,是一个viewpager + viewgroup。然后我们在源码中将具体的view添加到viewgroup中去,这就实现了小点点的数媒与viewpager一致,并能在viewpager中fragment动态改变的时候也能自动改变。增强可拓展性!

 

在源码中不仅添加小点点,也为viewpager的滑动增加小点点的背景改变,也就是导航。当然如果想在小点点中做点击事件也是同样可以的,考虑一下焦点获取的问题就ok了。

二、参考源码

在源码中,我们可以参考如下代码:

public classMainActivity extends Activity {
 
    private ViewPager viewPager;
    private ArrayList<View> pageViews;
    private ImageView imageView;
    private ImageView[] imageViews;
    // 包裹滑动图片LinearLayout
    private ViewGroup main;
    // 包裹小圆点的LinearLayout
    private ViewGroup group;
    @SuppressWarnings("unused")
    privateArrayAdapter<View> pp;
 
    @Override
    public void onCreate(BundlesavedInstanceState) {
       super.onCreate(savedInstanceState);
 
       this.setContentView(R.layout.pager_layout);
      
       int[] img = new int[] { R.drawable.no1, R.drawable.no2, R.drawable.no3,
              R.drawable.no4, R.drawable.no5 };
       pageViews = newArrayList<View>();
       for (int i = 0; i < img.length; i++) {
           LinearLayoutlayout = newLinearLayout(this);
           LayoutParamsltp = newLayoutParams(LayoutParams.MATCH_PARENT,
                  LayoutParams.MATCH_PARENT);
           final ImageView imageView = new ImageView(this);
           imageView.setScaleType(ScaleType.CENTER_INSIDE);
           imageView.setImageResource(img[i]);
           layout.addView(imageView,ltp);
           pageViews.add(layout);
       }
      
       group = (ViewGroup)findViewById(R.id.viewGroup);
       viewPager = (ViewPager)findViewById(R.id.guidePages);
 
       /**
        * 有几张图片下面就显示几个小圆点
        */
       imageViews = new ImageView[pageViews.size()];
       LinearLayout.LayoutParamsmargin = newLinearLayout.LayoutParams(
              LinearLayout.LayoutParams.WRAP_CONTENT,
              LinearLayout.LayoutParams.WRAP_CONTENT);
       // 设置每个小圆点距离左边的间距
                  margin.setMargins(10,0, 0, 0);
       for (int i = 0; i < pageViews.size(); i++) {
           imageView = new ImageView(MainActivity.this);
           // 设置每个小圆点的宽高
           imageView.setLayoutParams(new LayoutParams(15, 15));
           imageViews[i] = imageView;
           if (i == 0) {
              // 默认选中第一张图片
              imageViews[i]
                     .setBackgroundResource(R.drawable.page_indicator_focused);
           }else{
              // 其他图片都设置未选中状态
              imageViews[i]
                     .setBackgroundResource(R.drawable.page_indicator_unfocused);
           }
           group.addView(imageViews[i], margin);
       }
       // 给viewpager设置适配器
       viewPager.setAdapter(new GuidePageAdapter());
       // 给viewpager设置监听事件
       viewPager.setOnPageChangeListener(newGuidePageChangeListener());
    }
 
    // 指引页面数据适配器
    class GuidePageAdapter extends PagerAdapter {
 
       @Override
       public int getCount() {
           return pageViews.size();
       }
 
       @Override
       public boolean isViewFromObject(Viewarg0, Object arg1) {
           return arg0 == arg1;
       }
 
       @Override
       public void destroyItem(View arg0, int arg1, Object arg2) {
           // TODO Auto-generated method stub
           ((ViewPager)arg0).removeView(pageViews.get(arg1));
       }
 
       @Override
       public ObjectinstantiateItem(View arg0, int arg1) {
           // TODO Auto-generated method stub
           ((ViewPager)arg0).addView(pageViews.get(arg1));
           return pageViews.get(arg1);
       }
 
    }
 
    // 指引页面更改事件监听器
    class GuidePageChangeListenerimplementsOnPageChangeListener {
 
       @Override
       public voidonPageScrollStateChanged(int arg0) {
           // TODO Auto-generated method stub
 
       }
 
       @Override
       public void onPageScrolled(int arg0, float arg1, int arg2) {
           // TODO Auto-generated method stub
 
       }
 
       @Override
       public void onPageSelected(int arg0) {
           // 遍历数组让当前选中图片下的小圆点设置颜色
           for (int i = 0; i < imageViews.length; i++) {
              imageViews[arg0]
                     .setBackgroundResource(R.drawable.page_indicator_focused);
 
              if (arg0 != i) {
                  imageViews[i]
                         .setBackgroundResource(R.drawable.page_indicator_unfocused);
              }
           }
       }
    }
}

至此就基本实现了广告viewpager+小点点导航的demo了。

 

源码下载:

(申明,这源码并非我自己的原创,因为效果差不多就给出来了,是有参考价值的)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值