【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

来源:互联网 发布:怎么在淘宝买高仿手表 编辑:程序博客网 时间:2024/05/29 16:36

.

参考界面 : 携程app首页的广告栏, 使用ViewPager实现

      


自制页面效果图

源码下载地址http://download.csdn.net/detail/han1202012/6835401


.

作者 :万境绝尘 

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835

.


.


一. ViewPager适配页面问题


1. ViewPager出现的问题


ViewPager占满全屏问题 : ViewPager在XML中定义了Android:layout_height 和 android:layout_width 之后, 不论这两个属性的值是 fill_parent 还是 wrap_content, 都会出现ViewPager占满全屏的问题;


不使用固定值定义宽高: 为了使ViewPager能适配各种类型的手机, 如果给ViewPager定义了高度和宽度, 与各种手机的界面兼容性肯定要大大的降低, 因此出现了下面的解决方案;


2. 解决方案 


代码中添加组件 : 不在XML界面定义该组件, 可以在布局文件中,定义一个LinearLayout容器, 然后在代码中动态添加ViewPager;

好处 : 这样的好处是可以在代码中获取屏幕的宽高, 我们可以根据比例设定ViewPager的大小, 这样就解决了屏幕适配的问题;


3. 代码实现


[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. //从布局文件中获取ViewPager父容器  
  2. pagerLayout = (LinearLayout) findViewById(R.id.view_pager_content);  
  3. //创建ViewPager  
  4.     adViewPager = new ViewPager(this);  
  5.       
  6.     //获取屏幕像素相关信息  
  7.     DisplayMetrics dm = new DisplayMetrics();  
  8.       getWindowManager().getDefaultDisplay().getMetrics(dm);  
  9.       
  10.       //根据屏幕信息设置ViewPager广告容器的宽高  
  11.       adViewPager.setLayoutParams(new LayoutParams(dm.widthPixels, dm.heightPixels * 2 / 5));  
  12.         
  13.       //将ViewPager容器设置到布局文件父容器中  
  14.     pagerLayout.addView(adViewPager);  
     //从布局文件中获取ViewPager父容器        pagerLayout = (LinearLayout) findViewById(R.id.view_pager_content);        //创建ViewPager        adViewPager = new ViewPager(this);        //获取屏幕像素相关信息        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);        //根据屏幕信息设置ViewPager广告容器的宽高        adViewPager.setLayoutParams(new LayoutParams(dm.widthPixels, dm.heightPixels * 2 / 5));        //将ViewPager容器设置到布局文件父容器中        pagerLayout.addView(adViewPager);



二. ViewPager广告栏基本解决方案


1. ViewPager适配器PagerAdapter


自定义PagerAdapter类 : 我们需要自定义一个类, 去继承PageAdapter, 至少实现下面四个方法 : 


destroyItem(View Container, int position, Object object)

作用 :删除container中指定位置position的页面

参数 : container 就是容器, 这里指的是ViewPager对象, position就是删除的页面索引;


int getCount()

作用 :获取ViewPager页面的个数;

返回值 : ViewPager页面个数;


Object instantiateItem(View container, int position)

作用 :在给定的位置创建页面, PageAdapter负责向指定的position位置添加View页面;

参数 : container容器就是ViewPager, position指的是ViewPager的索引;

返回值 : 返回代表新的一页的对象;


boolean isViewFromObject(View view, Object object)

作用 :决定instantiateItem()方法返回的Object对象是不是需要显示的页面关联, 这个方法必须要有;

参数 : view 要关联的页面, object instantiateItem()方法返回的对象;

返回值 : 是否要关联显示页面与 instantiateItem()返回值;


为PageAdapter关联数据源 : 可以将一个数组或者集合与PageAdapter关联,集合的索引与ViewPager的索引对应, destroyItem()方法中删除集合中对应索引的元素对象, instantiateItem 添加对应索引的元素对象;


PageAdapter 代码示例 :

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. private final class AdvAdapter extends PagerAdapter {    
  2.     private List<View> views = null;    
  3.   
  4.     /** 
  5.      * 初始化数据源, 即View数组 
  6.      */  
  7.     public AdvAdapter(List<View> views) {    
  8.         this.views = views;    
  9.     }    
  10.       
  11.     /** 
  12.      * 从ViewPager中删除集合中对应索引的View对象 
  13.      */  
  14.     @Override    
  15.     public void destroyItem(View container, int position, Object object) {    
  16.         ((ViewPager) container).removeView(views.get(position));    
  17.     }    
  18.   
  19.     /** 
  20.      * 获取ViewPager的个数 
  21.      */  
  22.     @Override    
  23.     public int getCount() {    
  24.         return views.size();    
  25.     }    
  26.   
  27.     /** 
  28.      * 从View集合中获取对应索引的元素, 并添加到ViewPager中 
  29.      */  
  30.     @Override    
  31.     public Object instantiateItem(View container, int position) {    
  32.         ((ViewPager) container).addView(views.get(position), 0);    
  33.         return views.get(position);    
  34.     }    
  35.   
  36.     /** 
  37.      * 是否将显示的ViewPager页面与instantiateItem返回的对象进行关联 
  38.      * 这个方法是必须实现的 
  39.      */  
  40.     @Override    
  41.     public boolean isViewFromObject(View view, Object object) {    
  42.         return view == object;    
  43.     }    
  44. }  
    private final class AdvAdapter extends PagerAdapter {          private List<View> views = null;          /**         * 初始化数据源, 即View数组         */        public AdvAdapter(List<View> views) {              this.views = views;          }          /**         * 从ViewPager中删除集合中对应索引的View对象         */        @Override          public void destroyItem(View container, int position, Object object) {              ((ViewPager) container).removeView(views.get(position));          }          /**         * 获取ViewPager的个数         */        @Override          public int getCount() {              return views.size();          }          /**         * 从View集合中获取对应索引的元素, 并添加到ViewPager中         */        @Override          public Object instantiateItem(View container, int position) {              ((ViewPager) container).addView(views.get(position), 0);              return views.get(position);          }          /**         * 是否将显示的ViewPager页面与instantiateItem返回的对象进行关联         * 这个方法是必须实现的         */        @Override          public boolean isViewFromObject(View view, Object object) {              return view == object;          }      }

创建PageAdapter代码


[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. private void initPageAdapter() {  
  2.     pageViews = new ArrayList<View>();  
  3.       
  4.     ImageView img1 = new ImageView(this);    
  5.        img1.setBackgroundResource(R.drawable.view_add_1);    
  6.        pageViews.add(img1);    
  7.          
  8.        ImageView img2 = new ImageView(this);    
  9.        img2.setBackgroundResource(R.drawable.view_add_2);    
  10.        pageViews.add(img2);   
  11.          
  12.        ImageView img3 = new ImageView(this);    
  13.        img3.setBackgroundResource(R.drawable.view_add_3);    
  14.        pageViews.add(img3);   
  15.          
  16.        ImageView img4 = new ImageView(this);    
  17.        img4.setBackgroundResource(R.drawable.view_add_4);    
  18.        pageViews.add(img4);   
  19.          
  20.        ImageView img5 = new ImageView(this);    
  21.        img5.setBackgroundResource(R.drawable.view_add_5);    
  22.        pageViews.add(img5);   
  23.          
  24.        ImageView img6 = new ImageView(this);    
  25.        img6.setBackgroundResource(R.drawable.view_add_6);    
  26.        pageViews.add(img6);    
  27.          
  28.        adapter = new AdPageAdapter(pageViews);  
  29. }  
 private void initPageAdapter() {        pageViews = new ArrayList<View>();        ImageView img1 = new ImageView(this);          img1.setBackgroundResource(R.drawable.view_add_1);          pageViews.add(img1);          ImageView img2 = new ImageView(this);          img2.setBackgroundResource(R.drawable.view_add_2);          pageViews.add(img2);         ImageView img3 = new ImageView(this);          img3.setBackgroundResource(R.drawable.view_add_3);          pageViews.add(img3);         ImageView img4 = new ImageView(this);          img4.setBackgroundResource(R.drawable.view_add_4);          pageViews.add(img4);         ImageView img5 = new ImageView(this);          img5.setBackgroundResource(R.drawable.view_add_5);          pageViews.add(img5);         ImageView img6 = new ImageView(this);          img6.setBackgroundResource(R.drawable.view_add_6);          pageViews.add(img6);          adapter = new AdPageAdapter(pageViews);    }

2. 小圆点导航策略


圆点存放策略 : 所有的小圆点都放在一个ViewGroup中, 有两种圆点, 一种是当前显示的, 一种是没激活的, 这里我们将一组圆点分别放入ImageView中, 并且将这些ImageView组装起来放到ViewGroup中即可;


圆点导航初始化 : 最初默认显示第一个页面, 第一个圆点激活, 根据ViewPager个数初始化圆点的个数, 组装圆点的时候, 第一个圆点状态激活;

代码如下

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. private void initCirclePoint(){  
  2.     ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup);   
  3.        imageViews = new ImageView[pageViews.size()];    
  4.        //广告栏的小圆点图标  
  5.        for (int i = 0; i < pageViews.size(); i++) {    
  6.         //创建一个ImageView, 并设置宽高. 将该对象放入到数组中  
  7.         imageView = new ImageView(this);    
  8.            imageView.setLayoutParams(new LayoutParams(20,20));    
  9.            imageViews[i] = imageView;    
  10.              
  11.            //初始值, 默认第0个选中  
  12.            if (i == 0) {    
  13.                imageViews[i]    
  14.                        .setBackgroundResource(R.drawable.point_focused);    
  15.            } else {    
  16.                imageViews[i]    
  17.                        .setBackgroundResource(R.drawable.point_unfocused);    
  18.            }    
  19.            //将小圆点放入到布局中  
  20.            group.addView(imageViews[i]);    
  21.        }   
  22. }  
  private void initCirclePoint(){        ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup);         imageViews = new ImageView[pageViews.size()];          //广告栏的小圆点图标        for (int i = 0; i < pageViews.size(); i++) {              //创建一个ImageView, 并设置宽高. 将该对象放入到数组中            imageView = new ImageView(this);              imageView.setLayoutParams(new LayoutParams(20,20));              imageViews[i] = imageView;              //初始值, 默认第0个选中            if (i == 0) {                  imageViews[i]                          .setBackgroundResource(R.drawable.point_focused);              } else {                  imageViews[i]                          .setBackgroundResource(R.drawable.point_unfocused);              }              //将小圆点放入到布局中            group.addView(imageViews[i]);          }     }


ViewPager页面改变时圆点导航随之改变 : 获取ViewPager当前显示页面索引,重新组装ViewGroup中的圆点排列顺序, 这个方法在ViewPager页面改变监听器中实现;

代码如下

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  *  ViewPager 页面改变监听器  
  3.  */  
  4.    private final class AdPageChangeListener implements OnPageChangeListener {    
  5.       
  6.     /** 
  7.      * 页面滚动状态发生改变的时候触发 
  8.      */  
  9.        @Override    
  10.        public void onPageScrollStateChanged(int arg0) {    
  11.        }    
  12.    
  13.        /** 
  14.         * 页面滚动的时候触发 
  15.         */  
  16.        @Override    
  17.        public void onPageScrolled(int arg0, float arg1, int arg2) {    
  18.        }    
  19.    
  20.        /** 
  21.         * 页面选中的时候触发 
  22.         */  
  23.        @Override    
  24.        public void onPageSelected(int arg0) {    
  25.         //获取当前显示的页面是哪个页面  
  26.            atomicInteger.getAndSet(arg0);    
  27.            //重新设置原点布局集合  
  28.            for (int i = 0; i < imageViews.length; i++) {    
  29.                imageViews[arg0]    
  30.                        .setBackgroundResource(R.drawable.point_focused);    
  31.                if (arg0 != i) {    
  32.                    imageViews[i]    
  33.                            .setBackgroundResource(R.drawable.point_unfocused);    
  34.                }    
  35.            }    
  36.        }    
  37.    }   
    /**     *  ViewPager 页面改变监听器      */    private final class AdPageChangeListener implements OnPageChangeListener {          /**         * 页面滚动状态发生改变的时候触发         */        @Override          public void onPageScrollStateChanged(int arg0) {          }          /**         * 页面滚动的时候触发         */        @Override          public void onPageScrolled(int arg0, float arg1, int arg2) {          }          /**         * 页面选中的时候触发         */        @Override          public void onPageSelected(int arg0) {              //获取当前显示的页面是哪个页面            atomicInteger.getAndSet(arg0);              //重新设置原点布局集合            for (int i = 0; i < imageViews.length; i++) {                  imageViews[arg0]                          .setBackgroundResource(R.drawable.point_focused);                  if (arg0 != i) {                      imageViews[i]                              .setBackgroundResource(R.drawable.point_unfocused);                  }              }          }      } 


3. 自动翻页导航策略


线程中处理自动翻页 : 启动一个线程, 获取当前页面显示索引, 计算出下一个显示位置, 显示下一个页面;

.

相关代码

线程代码 : 

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. new Thread(new Runnable() {    
  2.        @Override    
  3.        public void run() {    
  4.            while (true) {    
  5.                if (isContinue) {    
  6.                    viewHandler.sendEmptyMessage(atomicInteger.get());    
  7.                    atomicOption();    
  8.                }    
  9.            }    
  10.        }    
  11.    }).start();    
      new Thread(new Runnable() {              @Override              public void run() {                  while (true) {                      if (isContinue) {                          viewHandler.sendEmptyMessage(atomicInteger.get());                          atomicOption();                      }                  }              }          }).start();  

handler代码 : 

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. private void atomicOption() {    
  2.     atomicInteger.incrementAndGet();    
  3.     if (atomicInteger.get() > imageViews.length - 1) {    
  4.         atomicInteger.getAndAdd(-5);    
  5.     }    
  6.     try {    
  7.         Thread.sleep(3000);    
  8.     } catch (InterruptedException e) {    
  9.             
  10.     }    
  11. }   
  12.   
  13. /* 
  14.  * 每隔固定时间切换广告栏图片 
  15.  */  
  16. private final Handler viewHandler = new Handler() {    
  17.   
  18.     @Override    
  19.     public void handleMessage(Message msg) {    
  20.         adViewPager.setCurrentItem(msg.what);    
  21.         super.handleMessage(msg);    
  22.     }    
  23.   
  24. };  
    private void atomicOption() {          atomicInteger.incrementAndGet();          if (atomicInteger.get() > imageViews.length - 1) {              atomicInteger.getAndAdd(-5);          }          try {              Thread.sleep(3000);          } catch (InterruptedException e) {          }      }     /*     * 每隔固定时间切换广告栏图片     */    private final Handler viewHandler = new Handler() {          @Override          public void handleMessage(Message msg) {              adViewPager.setCurrentItem(msg.what);              super.handleMessage(msg);          }      };

.

作者 :万境绝尘 

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835

.


三. 程序所有代码 和 资源文件


XML布局文件

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”  
  3.     android:layout_width=“match_parent”  
  4.     android:layout_height=“match_parent”  
  5.     android:orientation=“vertical” >  
  6.       
  7.     <RelativeLayout    
  8.         android:layout_width=“fill_parent”    
  9.         android:layout_height=“fill_parent”    
  10.         android:layout_weight=“5”  
  11.         android:orientation=“vertical” >    
  12.           
  13.         <LinearLayout android:id=“@+id/view_pager_content”  
  14.             android:layout_height=“wrap_content”  
  15.             android:layout_width=“wrap_content”  
  16.             android:orientation=“vertical”/>  
  17.            
  18.         <LinearLayout    
  19.             android:id=“@+id/viewGroup”    
  20.             android:layout_below=“@id/view_pager_content”    
  21.             android:layout_width=“fill_parent”    
  22.             android:layout_height=“wrap_content”    
  23.             android:layout_marginTop=“-25px”    
  24.             android:gravity=“right”    
  25.             android:orientation=“horizontal” >    
  26.         </LinearLayout>    
  27.     </RelativeLayout>   
  28.       
  29.     <LinearLayout   
  30.         android:layout_width=“fill_parent”  
  31.         android:layout_height=“fill_parent”  
  32.         android:layout_weight=“2”  
  33.         android:orientation=“vertical”  
  34.         android:background=“#BBFFBB”>  
  35.     </LinearLayout>  
  36.       
  37. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <RelativeLayout          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:layout_weight="5"        android:orientation="vertical" >          <LinearLayout android:id="@+id/view_pager_content"            android:layout_height="wrap_content"            android:layout_width="wrap_content"            android:orientation="vertical"/>        <LinearLayout              android:id="@+id/viewGroup"              android:layout_below="@id/view_pager_content"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:layout_marginTop="-25px"              android:gravity="right"              android:orientation="horizontal" >          </LinearLayout>      </RelativeLayout>     <LinearLayout         android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_weight="2"        android:orientation="vertical"        android:background="#BBFFBB">    </LinearLayout></LinearLayout>


主Activity源码

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. package shuliang.han.myviewpager;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.atomic.AtomicInteger;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11. import android.support.v4.view.PagerAdapter;  
  12. import android.support.v4.view.ViewPager;  
  13. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  14. import android.util.DisplayMetrics;  
  15. import android.view.View;  
  16. import android.view.ViewGroup;  
  17. import android.view.ViewGroup.LayoutParams;  
  18. import android.widget.ImageView;  
  19. import android.widget.LinearLayout;  
  20.   
  21. public class MainActivity extends Activity {  
  22.   
  23.     private ViewPager adViewPager;  
  24.     private LinearLayout pagerLayout;  
  25.     private List<View> pageViews;  
  26.     private ImageView[] imageViews;  
  27.     private ImageView imageView;    
  28.     private AdPageAdapter adapter;  
  29.     private AtomicInteger atomicInteger = new AtomicInteger(0);    
  30.     private boolean isContinue = true;   
  31.       
  32.       
  33.     @Override  
  34.     protected void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.activity_main);  
  37.           
  38.         initViewPager();  
  39.     }  
  40.   
  41.     private void initViewPager() {  
  42.   
  43.         //从布局文件中获取ViewPager父容器  
  44.         pagerLayout = (LinearLayout) findViewById(R.id.view_pager_content);  
  45.         //创建ViewPager  
  46.         adViewPager = new ViewPager(this);  
  47.           
  48.         //获取屏幕像素相关信息  
  49.         DisplayMetrics dm = new DisplayMetrics();  
  50.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  51.           
  52.         //根据屏幕信息设置ViewPager广告容器的宽高  
  53.         adViewPager.setLayoutParams(new LayoutParams(dm.widthPixels, dm.heightPixels * 2 / 5));  
  54.           
  55.         //将ViewPager容器设置到布局文件父容器中  
  56.         pagerLayout.addView(adViewPager);  
  57.           
  58.         initPageAdapter();  
  59.           
  60.         initCirclePoint();  
  61.           
  62.         adViewPager.setAdapter(adapter);  
  63.         adViewPager.setOnPageChangeListener(new AdPageChangeListener());  
  64.           
  65.         new Thread(new Runnable() {    
  66.             @Override    
  67.             public void run() {    
  68.                 while (true) {    
  69.                     if (isContinue) {    
  70.                         viewHandler.sendEmptyMessage(atomicInteger.get());    
  71.                         atomicOption();    
  72.                     }    
  73.                 }    
  74.             }    
  75.         }).start();    
  76.     }  
  77.       
  78.       
  79.     private void atomicOption() {    
  80.         atomicInteger.incrementAndGet();    
  81.         if (atomicInteger.get() > imageViews.length - 1) {    
  82.             atomicInteger.getAndAdd(-5);    
  83.         }    
  84.         try {    
  85.             Thread.sleep(3000);    
  86.         } catch (InterruptedException e) {    
  87.                 
  88.         }    
  89.     }   
  90.       
  91.     /* 
  92.      * 每隔固定时间切换广告栏图片 
  93.      */  
  94.     private final Handler viewHandler = new Handler() {    
  95.     
  96.         @Override    
  97.         public void handleMessage(Message msg) {    
  98.             adViewPager.setCurrentItem(msg.what);    
  99.             super.handleMessage(msg);    
  100.         }    
  101.     
  102.     };   
  103.       
  104.     private void initPageAdapter() {  
  105.         pageViews = new ArrayList<View>();  
  106.           
  107.         ImageView img1 = new ImageView(this);    
  108.         img1.setBackgroundResource(R.drawable.view_add_1);    
  109.         pageViews.add(img1);    
  110.           
  111.         ImageView img2 = new ImageView(this);    
  112.         img2.setBackgroundResource(R.drawable.view_add_2);    
  113.         pageViews.add(img2);   
  114.           
  115.         ImageView img3 = new ImageView(this);    
  116.         img3.setBackgroundResource(R.drawable.view_add_3);    
  117.         pageViews.add(img3);   
  118.           
  119.         ImageView img4 = new ImageView(this);    
  120.         img4.setBackgroundResource(R.drawable.view_add_4);    
  121.         pageViews.add(img4);   
  122.           
  123.         ImageView img5 = new ImageView(this);    
  124.         img5.setBackgroundResource(R.drawable.view_add_5);    
  125.         pageViews.add(img5);   
  126.           
  127.         ImageView img6 = new ImageView(this);    
  128.         img6.setBackgroundResource(R.drawable.view_add_6);    
  129.         pageViews.add(img6);    
  130.           
  131.         adapter = new AdPageAdapter(pageViews);  
  132.     }  
  133.       
  134.     private void initCirclePoint(){  
  135.         ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup);   
  136.         imageViews = new ImageView[pageViews.size()];    
  137.         //广告栏的小圆点图标  
  138.         for (int i = 0; i < pageViews.size(); i++) {    
  139.             //创建一个ImageView, 并设置宽高. 将该对象放入到数组中  
  140.             imageView = new ImageView(this);    
  141.             imageView.setLayoutParams(new LayoutParams(10,10));    
  142.             imageViews[i] = imageView;    
  143.               
  144.             //初始值, 默认第0个选中  
  145.             if (i == 0) {    
  146.                 imageViews[i]    
  147.                         .setBackgroundResource(R.drawable.point_focused);    
  148.             } else {    
  149.                 imageViews[i]    
  150.                         .setBackgroundResource(R.drawable.point_unfocused);    
  151.             }    
  152.             //将小圆点放入到布局中  
  153.             group.addView(imageViews[i]);    
  154.         }   
  155.     }  
  156.       
  157.     /** 
  158.      *  ViewPager 页面改变监听器  
  159.      */  
  160.     private final class AdPageChangeListener implements OnPageChangeListener {    
  161.           
  162.         /** 
  163.          * 页面滚动状态发生改变的时候触发 
  164.          */  
  165.         @Override    
  166.         public void onPageScrollStateChanged(int arg0) {    
  167.         }    
  168.     
  169.         /** 
  170.          * 页面滚动的时候触发 
  171.          */  
  172.         @Override    
  173.         public void onPageScrolled(int arg0, float arg1, int arg2) {    
  174.         }    
  175.     
  176.         /** 
  177.          * 页面选中的时候触发 
  178.          */  
  179.         @Override    
  180.         public void onPageSelected(int arg0) {    
  181.             //获取当前显示的页面是哪个页面  
  182.             atomicInteger.getAndSet(arg0);    
  183.             //重新设置原点布局集合  
  184.             for (int i = 0; i < imageViews.length; i++) {    
  185.                 imageViews[arg0]    
  186.                         .setBackgroundResource(R.drawable.point_focused);    
  187.                 if (arg0 != i) {    
  188.                     imageViews[i]    
  189.                             .setBackgroundResource(R.drawable.point_unfocused);    
  190.                 }    
  191.             }    
  192.         }    
  193.     }   
  194.       
  195.       
  196.     private final class AdPageAdapter extends PagerAdapter {    
  197.         private List<View> views = null;    
  198.     
  199.         /** 
  200.          * 初始化数据源, 即View数组 
  201.          */  
  202.         public AdPageAdapter(List<View> views) {    
  203.             this.views = views;    
  204.         }    
  205.           
  206.         /** 
  207.          * 从ViewPager中删除集合中对应索引的View对象 
  208.          */  
  209.         @Override    
  210.         public void destroyItem(View container, int position, Object object) {    
  211.             ((ViewPager) container).removeView(views.get(position));    
  212.         }    
  213.     
  214.         /** 
  215.          * 获取ViewPager的个数 
  216.          */  
  217.         @Override    
  218.         public int getCount() {    
  219.             return views.size();    
  220.         }    
  221.     
  222.         /** 
  223.          * 从View集合中获取对应索引的元素, 并添加到ViewPager中 
  224.          */  
  225.         @Override    
  226.         public Object instantiateItem(View container, int position) {    
  227.             ((ViewPager) container).addView(views.get(position), 0);    
  228.             return views.get(position);    
  229.         }    
  230.     
  231.         /** 
  232.          * 是否将显示的ViewPager页面与instantiateItem返回的对象进行关联 
  233.          * 这个方法是必须实现的 
  234.          */  
  235.         @Override    
  236.         public boolean isViewFromObject(View view, Object object) {    
  237.             return view == object;    
  238.         }    
  239.     }  
  240. }  
package shuliang.han.myviewpager;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.DisplayMetrics;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;import android.widget.LinearLayout;public class MainActivity extends Activity {    private ViewPager adViewPager;    private LinearLayout pagerLayout;    private List<View> pageViews;    private ImageView[] imageViews;    private ImageView imageView;      private AdPageAdapter adapter;    private AtomicInteger atomicInteger = new AtomicInteger(0);      private boolean isContinue = true;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViewPager();    }    private void initViewPager() {        //从布局文件中获取ViewPager父容器        pagerLayout = (LinearLayout) findViewById(R.id.view_pager_content);        //创建ViewPager        adViewPager = new ViewPager(this);        //获取屏幕像素相关信息        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);        //根据屏幕信息设置ViewPager广告容器的宽高        adViewPager.setLayoutParams(new LayoutParams(dm.widthPixels, dm.heightPixels * 2 / 5));        //将ViewPager容器设置到布局文件父容器中        pagerLayout.addView(adViewPager);        initPageAdapter();        initCirclePoint();        adViewPager.setAdapter(adapter);        adViewPager.setOnPageChangeListener(new AdPageChangeListener());        new Thread(new Runnable() {              @Override              public void run() {                  while (true) {                      if (isContinue) {                          viewHandler.sendEmptyMessage(atomicInteger.get());                          atomicOption();                      }                  }              }          }).start();      }    private void atomicOption() {          atomicInteger.incrementAndGet();          if (atomicInteger.get() > imageViews.length - 1) {              atomicInteger.getAndAdd(-5);          }          try {              Thread.sleep(3000);          } catch (InterruptedException e) {          }      }     /*     * 每隔固定时间切换广告栏图片     */    private final Handler viewHandler = new Handler() {          @Override          public void handleMessage(Message msg) {              adViewPager.setCurrentItem(msg.what);              super.handleMessage(msg);          }      };     private void initPageAdapter() {        pageViews = new ArrayList<View>();        ImageView img1 = new ImageView(this);          img1.setBackgroundResource(R.drawable.view_add_1);          pageViews.add(img1);          ImageView img2 = new ImageView(this);          img2.setBackgroundResource(R.drawable.view_add_2);          pageViews.add(img2);         ImageView img3 = new ImageView(this);          img3.setBackgroundResource(R.drawable.view_add_3);          pageViews.add(img3);         ImageView img4 = new ImageView(this);          img4.setBackgroundResource(R.drawable.view_add_4);          pageViews.add(img4);         ImageView img5 = new ImageView(this);          img5.setBackgroundResource(R.drawable.view_add_5);          pageViews.add(img5);         ImageView img6 = new ImageView(this);          img6.setBackgroundResource(R.drawable.view_add_6);          pageViews.add(img6);          adapter = new AdPageAdapter(pageViews);    }    private void initCirclePoint(){        ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup);         imageViews = new ImageView[pageViews.size()];          //广告栏的小圆点图标        for (int i = 0; i < pageViews.size(); i++) {              //创建一个ImageView, 并设置宽高. 将该对象放入到数组中            imageView = new ImageView(this);              imageView.setLayoutParams(new LayoutParams(10,10));              imageViews[i] = imageView;              //初始值, 默认第0个选中            if (i == 0) {                  imageViews[i]                          .setBackgroundResource(R.drawable.point_focused);              } else {                  imageViews[i]                          .setBackgroundResource(R.drawable.point_unfocused);              }              //将小圆点放入到布局中            group.addView(imageViews[i]);          }     }    /**     *  ViewPager 页面改变监听器      */    private final class AdPageChangeListener implements OnPageChangeListener {          /**         * 页面滚动状态发生改变的时候触发         */        @Override          public void onPageScrollStateChanged(int arg0) {          }          /**         * 页面滚动的时候触发         */        @Override          public void onPageScrolled(int arg0, float arg1, int arg2) {          }          /**         * 页面选中的时候触发         */        @Override          public void onPageSelected(int arg0) {              //获取当前显示的页面是哪个页面            atomicInteger.getAndSet(arg0);              //重新设置原点布局集合            for (int i = 0; i < imageViews.length; i++) {                  imageViews[arg0]                          .setBackgroundResource(R.drawable.point_focused);                  if (arg0 != i) {                      imageViews[i]                              .setBackgroundResource(R.drawable.point_unfocused);                  }              }          }      }     private final class AdPageAdapter extends PagerAdapter {          private List<View> views = null;          /**         * 初始化数据源, 即View数组         */        public AdPageAdapter(List<View> views) {              this.views = views;          }          /**         * 从ViewPager中删除集合中对应索引的View对象         */        @Override          public void destroyItem(View container, int position, Object object) {              ((ViewPager) container).removeView(views.get(position));          }          /**         * 获取ViewPager的个数         */        @Override          public int getCount() {              return views.size();          }          /**         * 从View集合中获取对应索引的元素, 并添加到ViewPager中         */        @Override          public Object instantiateItem(View container, int position) {              ((ViewPager) container).addView(views.get(position), 0);              return views.get(position);          }          /**         * 是否将显示的ViewPager页面与instantiateItem返回的对象进行关联         * 这个方法是必须实现的         */        @Override          public boolean isViewFromObject(View view, Object object) {              return view == object;          }      }}

.

作者 :万境绝尘 

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835

.


效果图



源码下载地址 : http://download.csdn.net/detail/han1202012/6835401

.

源于http://blog.csdn.net/shulianghan/article/details/18089181

0 0
原创粉丝点击