博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ViewPager实现引导页
阅读量:6059 次
发布时间:2019-06-20

本文共 8099 字,大约阅读时间需要 26 分钟。

 

1 package com.example.viewpage2;  2   3 import java.util.ArrayList;  4 import java.util.List;  5   6 import android.os.Bundle;  7 import android.app.Activity;  8 import android.support.v4.view.ViewPager;  9 import android.support.v4.view.ViewPager.OnPageChangeListener; 10 import android.view.Menu; 11 import android.view.View; 12 import android.view.View.OnClickListener; 13 import android.view.ViewGroup.LayoutParams; 14 import android.widget.ImageView; 15 import android.widget.LinearLayout; 16  17 public class MainActivity extends Activity implements OnPageChangeListener,OnClickListener{ 18  19     private ViewPager vp; 20     private List
views; 21 private int[] imgs = { R.drawable.img1, R.drawable.img2, R.drawable.img3, 22 R.drawable.img4 }; 23 private ViewPageAdapter vpa; 24 private LinearLayout ll; 25 private ImageView[] points; 26 private int index; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 initView(); 33 initData(); 34 initPoint(); 35 36 } 37 38 private void initView() { 39 ll = (LinearLayout) findViewById(R.id.ll); 40 vp = (ViewPager) findViewById(R.id.vp); 41 views = new ArrayList
(); 42 } 43 44 private void initData() { 45 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, 46 LayoutParams.MATCH_PARENT); 47 for (int i : imgs) { 48 ImageView img = new ImageView(this); 49 img.setImageResource(i); 50 img.setLayoutParams(lp); 51 views.add(img); 52 53 } 54 vpa = new ViewPageAdapter(views); 55 vp.setAdapter(vpa); 56 vp.setOnPageChangeListener(this); 57 } 58 private void initPoint(){ 59 points = new ImageView[imgs.length]; 60 //首先先定义一个imageview数组来接收他们,因为他们在linearlayout里 61 //所以通过循环把他们都放在数组里,并且让他们都设置成未选中状态, 62 for (int i = 0; i < ll.getChildCount(); i++) { 63 points[i] = (ImageView) ll.getChildAt(i); 64 points[i].setImageResource(R.drawable.point_two); 65 points[i].setOnClickListener(this); 66 points[i].setTag(i); 67 } 68 //因为第一页是选中状态所以我们要定义一个数组下表来表示选中的状态 69 index = 0; 70 points[index].setImageResource(R.drawable.point_one); 71 } 72 73 @Override 74 public void onPageScrollStateChanged(int arg0) { 75 // TODO Auto-generated method stub 76 77 } 78 79 @Override 80 public void onPageScrolled(int arg0, float arg1, int arg2) { 81 // TODO Auto-generated method stub 82 83 } 84 85 @Override//新页面选中时候调用 86 public void onPageSelected(int position) { 87 for (int i = 0; i < ll.getChildCount(); i++) { 88 points[i] = (ImageView) ll.getChildAt(i); 89 points[i].setImageResource(R.drawable.point_two); 90 } 91 points[position].setImageResource(R.drawable.point_one); 92 93 } 94 95 @Override 96 public void onClick(View v) { 97 int i = (Integer)v.getTag(); 98 vp.setCurrentItem(i); 99 100 }101 102 }

 

1 
5 6
10
11 12
18 19
25 26
31 32
37 38
43 44
51 52
package com.example.viewpage2;import java.util.List;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;public class ViewPageAdapter extends PagerAdapter {     List
views; public ViewPageAdapter(List
views){ this.views = views; } @Override //返回页数 public int getCount() { // TODO Auto-generated method stub return views.size(); } @Override //初始化position数值下的图片 public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(views.get(position)); return views.get(position); } @Override //判断是否由界面生成对象 public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } @Override //销毁上一个图片 public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager)container).removeView(views.get(position)); } }

 

首先的思想就是布局,其实这个布局还挺简单的用到的是框架布局,然后下面有一个线性布局横向排列,有四张图片一个点点。 

 

布局有了之后我们要着手写代码。 要声明viewpager,还要声明一个保存view的list,还要声明一个存图片id的数组, 然后我们要有两个方法,一个是用来初始化view的,另一个是初始化数据的,最后咋oncrete方法里调用就可以  private ViewPager vp;  private List<View> views;  private int[] imgs = { R.drawable.img1, R.drawable.img2, R.drawable.img3,    R.drawable.img4 };  private ViewPageAdapter vpa;  private void initView() {   vp = (ViewPager) findViewById(R.id.vp);   views = new ArrayList<View>();  }

 private void initData() {   LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,     LayoutParams.MATCH_PARENT);        为了设置图片的宽高   for (int i : imgs) {                               对存图片id的数组进行循环,每循环一次都要新建一个    ImageView img = new ImageView(this);       ImageView ,然后把这个ImageView设置大小,放在    img.setImageResource(i);                   里面就可以;    img.setLayoutParams(lp);    views.add(img);

  }   vpa = new ViewPageAdapter(views);    initPoint();   绑定adapter   vp.setAdapter(vpa);   vp.setOnPageChangeListener(this);     设置事件,为了让圆点与之匹配  } 接下来数据和视图绑定我们都要用到adapter,因为没有可用adapter,所以我们要自己写 我们要继承pageradapter,这个是针对有一张张视图的空间的。 然后我们要实现里面的四个方法,

public class ViewPageAdapter extends PagerAdapter {   private List<View> views;   public ViewPageAdapter(List<View> views){     构造方法用来传递那个已经有图片的list    this.views = views;   }  @Override  //返回页数  public int getCount() {   // TODO Auto-generated method stub   return views.size();  }  @Override  //初始化position数值下的图片  public Object instantiateItem(View container, int position) {      数值的下标是用0开始   ((ViewPager)container).addView(views.get(position));       第一次打开的时候它会创建两个界面为0,1   return views.get(position);                                1当往右划时候又会创建2,这时候内存中有三  }                                                                  个界面,             2当再划的时候会销毁第0个界面,并  @Override                                                          且创建第三个界面,  //判断是否由界面生成对象                                             当  public boolean isViewFromObject(View arg0, Object arg1) {          3当在划的时候会销毁第1个界面,因为后面   // TODO Auto-generated method stub                         没有不再创建,总结就是开头和结尾的页面   return arg0==arg1;                                         内存有两个图片,中间的过程内存有三张  }  @Override  //销毁上一个图片  public void destroyItem(ViewGroup container, int position, Object object) {   ((ViewPager)container).removeView(views.get(position));  }

} 最后将adapter和viewpager绑定就可以了

在此基础之上我们要加上圆点的功能,首先我们也写一个类来初始化这些圆点(就是获得他们) 第一步我们来定义一个imgview数组;然后在这个方法里实例化,数组的长度就为我们图片的长度。 第二步这些圆点存在一个线性布局里,所以我们要声明这个线性布局,然后通过循环将这些圆点放进这个数组里,并且把他们 设置成没有选中的状态。 第三步我们还需要一个下标来跟进这个圆点选中的状态,所以声明这个圆点的下标,并且设置选中状态;  private LinearLayout ll;  private ImageView[] points;  private int index;

  private void initPoint(){   points = new ImageView[imgs.length];   //首先先定义一个imageview数组来接收他们,因为他们在linearlayout里   //所以通过循环把他们都放在数组里,并且让他们都设置成未选中状态,   for (int i = 0; i < ll.getChildCount(); i++) {    points[i] = (ImageView) ll.getChildAt(i);    points[i].setImageResource(R.drawable.point_two);    points[i].setOnClickListener(this);      设置点击事件,点击圆点能够跳转到对应的界面    points[i].setTag(i);   }   //因为第一页是选中状态所以我们要定义一个数组下表来表示选中的状态   index = 0;   points[index].setImageResource(R.drawable.point_one);  }

已经把这些数据放进数组里了,下一步我们要实现滑动来跟圆点匹配,我们要想实现这个功能一定要配合监听器,这里我们要实现

OnPageChangeListener这个监听器,然后一共有三个方法,我们主要用最后一个, @Override  public void onPageScrollStateChanged(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 position) {   for (int i = 0; i < ll.getChildCount(); i++) {//首先一定我们要把这些圆点都设置成空    points[i] = (ImageView) ll.getChildAt(i);           points[i].setImageResource(R.drawable.point_two);     }   points[position].setImageResource(R.drawable.point_one);然后在让他根据选择的页数来设置选中的圆点。     } 最后我们还要实现一个功能就是点击的时候可以快速的跳转页面, 让每个圆点都有点击事件,并且把它的下标一起传递,    points[i].setOnClickListener(this);    points[i].setTag(i);

 

 @Override  public void onClick(View v) {   int i = (Integer)v.getTag();获得下标   vp.setCurrentItem(i);    设置页面     }

转载于:https://www.cnblogs.com/84126858jmz/p/4840743.html

你可能感兴趣的文章
Oracle DG 逻辑Standby数据同步性能优化
查看>>
E - Mafia CodeForces - 348A (推公式,思维)
查看>>
exchange 2010 队列删除
查看>>
ecshop 通杀2.6*2.7 GBK版本 oday 爆路径 GetShell
查看>>
vsftp配置虚拟账户
查看>>
在java程序中取后面两个小数点的方法
查看>>
JavaScript中json的一些操作
查看>>
中国压力最大的10个地方
查看>>
CSS样式大全参考
查看>>
红帽7(centos 7)配置VSFTP
查看>>
企业应该怎样对源代码管理保护
查看>>
一台T服务器实现cluster详细实施步骤
查看>>
OpenCV入门指南 人脸检测 haar分类器
查看>>
Light Weight CNN模型的分析与总结
查看>>
整合Apache和tomcat,实现端口转发
查看>>
SQL-12 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary...
查看>>
JS中offsetHeight/offsetWidth,clientHeight/clientWidth,scrollHeight/scrollWidth详解
查看>>
SQL Server 2014 Whitepaper 白皮书下载列表
查看>>
视频会议系统-H.323协议
查看>>
关机后鼠标指示灯还亮着
查看>>