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了。

源码下载:

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

时间: 2024-09-26 20:10:12

Viewpager + 小点点导航的具体实现的相关文章

自定义ViewPager的导航indecator(非常实用和主流)

自定义ViewPager的导航indecator(非常实用和主流) 现在很多App的欢迎页或者主页的轮播下面都有indicator(就是那个随着viewpager滚动而跟着滚动的小圆点):然后很多显示效果基本就是放一个选中的图片和一个未选择的图片,让这两个图片不断的轮换,这个效果都是烂大街了.而有一种效果就是那个选中的小圆点是随着viewpager的滑动而滑动有明显的动画效果,我就琢磨着怎样做这样一个效果,果不起然,功夫不负有心人,终于弄出来了,效果如下: 先制作一个草稿图如下: 要考虑的技术点

ViewPager实现导航页

我们在首次安装app时,往往会发现会有导航页. 导航页一般用于介绍功能和引导使用,那我们其实可以用ViewPager实现. ViewPager用于实现多页面的滑动切换效果,使用时需要引入"android.support.v4"包. 好了,我们现在开始就来做一个简单的导航页引导. 首先我们新建一个Android Application Project,我们把自动生成的MainActivity作为应用程序的主界面: 其布局文件我们简单设置下: activity_main.xml: <

【Android实战】ScrollView+GridView+ViewPager实现导航页

按照常规思路,实现导航页有专门的TabHost或ViewPager,但自定义空间不大,再者,自己想熟悉一下多重布局和动画效果的使用,因此采用这种ScrollView+GridView+ViewPager的效果. 其中比较麻烦的是GridView实现横向的加载,并且下面的滚动条随着滑动也得滚动和动态发生位置变化. public class MainAct extends FragmentActivity { ViewPager viewPager; HorizontalScrollView scr

Android使用ViewPager实现导航菜单

首先设置页面的Fragment布局: public class TabFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Bundle bundle = getArguments(); String url = bundle.getStrin

Android ViewPager滑动导航菜单

不占满整个页面的滑动菜单,也可以是自动滑动广告~ package view.example.viewpagerexample; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import android.os.Bundle; import android.os.Handler; import android.os.Message; impor

Android 导航条效果实现(六) TabLayout+ViewPager+Fragment

TabLayout 一.继承结构 public class TabLayout extends HorizontalScrollView java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.HorizontalScrollView ? android.support.design.widget.TabLayout 二.TabLayou

android ViewPager左右滑动实现导航栏的背景随页面滑动而滑动

实现viewPager和导航栏进行结合的效果图:废话不说直接上图看效果:      随着左右的滑动背景的黄色也随着滑动,代码如下: 布局  weibo_2.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=

Android ViewPager导航------平凡中有奇迹

ViewPager做导航想不想有这样的效果: 比如说有四张图片,下面有四个圆点,当页面滑动的时候一个点变大一个点变小(或者是一个点变小一个点变大),等于说同时在执行两个动画. package com.example.day_2014_10_17_viewpager; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import android.app.Activity; i

ViewPager+Fragment实现滑动显示,且Fragment里面又放Fragment+viewPager

思路:新建一个Activity,且这个Activity要继承FragementActivity,在Activity的布局文件中放入了一个viewPager,为了效果好看,还做了个导航,使得ViewPager和导航栏能够实现联动.代码里面有解释,我就不详细介绍了!! 在往ViewPager放Fragment的时候,用到的适配器应该是FragmentPagerAdapter 导航栏的制作我是用了一个ImageView+TextView,若这时使用Imageview(或TextView)实现点击事件的