安卓开发笔记——ViewPager组件(仿微信引导界面)
这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ? 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果。 如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。 通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面。 ? 先来看下效果图: 这是一个仿微信的引导界面,图是我抠来的 实现功能: 能够左右滑动页面,下面对应的小圆圈点顺带着走,也可以对小圆点进行点击跳转(有些人可能会采用把小圆点写死,直接画在界面上的背景图,其实这个是个很不好的习惯,太不灵活,一旦改动起来,很不好维护) ? 其实要实现这种效果并不难,ViewPager这个控件和其他常见控件的实现方式大致相同(比如:ListView) 步骤:声明实例化控件->设置数据源->配置适配器->绑定适配器->(添加监听) ? 声明控件: 由于该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar” 1 <android.support.v4.view.ViewPager 2 android:id="@+id/viewpager" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" /> 数据源: 这里的是数据源是一个存放着View对象的集合: 实现方式有2种: 1、通过XML配置文件,把对应的页面设置好,然后把xml配置文件转换成view对象并载入这个集合里 2、通过代码动态生成,把生成的View对象载入到集合里。 ? 适配器: 我们需要去继承PagerAdapter类,并覆写相对应的方法(在下面代码部分会详细说) 下面提供必须实现的,最基本的几个方法: 1 @Override 2 public int getCount() {//返回页面数量 3 return 0; 4 } 5 6 7 boolean isViewFromObject(View arg0,Object arg1) {判断是否是view对象 8 return false 9 10 11 12 public Object instantiateItem(View container,int position) {实例化一个页面 13 super.instantiateItem(container,position); 14 15 16 17 void destroyItem(View container,1)">int position,Object object) {销毁一个页面 18 .destroyItem(container,position,object); 19 } 当然还可以设置更多样式,比如给ViewPager的每个页面都加入标题等,这里就不再多说,大家自己翻看API吧。 ? 直接上代码吧,本段代码是采用XML布局文件静态生成view对象的,其中有一段注释是提供代码动态生成view的方法,至于用哪个,看个人喜好了。 MainActivity.java(主程序类) 1 package com.example.wx_viewpagertest; 2 3 import java.util.ArrayList; 4 java.util.List; 5 6 android.app.Activity; 7 android.os.Bundle; 8 android.support.v4.view.ViewPager; 9 android.support.v4.view.ViewPager.OnPageChangeListener; 10 android.view.View; 11 android.view.View.OnClickListener; 12 android.widget.Button; 13 android.widget.ImageView; 14 android.widget.LinearLayout; 15 android.widget.Toast; 16 17 class MainActivity extends Activity implements OnPageChangeListener,OnClickListener{ 18 19 private ViewPager viewPager; 20 private List<View> viewList; 21 private int images[]={R.drawable.v1,R.drawable.v2,R.drawable.v3,R.drawable.v4};导航图片资源 22 View view1,view2,view3,view4; 23 private ImageView points[];存放小圆圈数组 24 25 private int currentIndex=0;当前页面,默认首页 26 27 Button startButton; 28 29 30 31 protected void onCreate(Bundle savedInstanceState) { 32 .onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 initViewPager();初始化ViewPager对象 35 initPoint();初始化导航小圆点 36 37 38 initPoint() { 39 LinearLayout linearLayout=(LinearLayout) findViewById(R.id.ll); 40 points=new ImageView[4]; 41 for(int i=0;i<points.length;i++){ 42 points[i]=(ImageView) linearLayout.getChildAt(i);遍历LinearLayout下的所有ImageView子节点 43 points[i].setEnabled(true);设置当前状态为允许(可点,灰色) 44 设置点击监听 45 points[i].setOnClickListener(this); 46 47 额外设置一个标识符,以便点击小圆点时跳转对应页面 48 points[i].setTag(i);标识符与圆点顺序一致 49 } 50 51 currentIndex=0 52 points[currentIndex].setEnabled(false);设置首页为当前页(小点着色,蓝色) 53 54 55 56 57 58 initViewPager() { 59 viewPager=(ViewPager) findViewById(R.id.viewpager);取得ViewPager实例 60 viewList=new ArrayList<View>();实例化list集合 61 62 /* 用代码的动态添加View 63 //添加对应的view进入集合(数据源) 64 for(int i=0;i<images.length;i++){ 65 ImageView imageView=new ImageView(MainActivity.this); 66 imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 67 imageView.setScaleType(ScaleType.FIT_XY);//设置缩放样式 68 imageView.setImageResource(images[i]); 69 viewList.add(imageView); 70 71 */ 72 73 用xml静态添加view 74 view1=View.inflate(MainActivity.this,R.layout.view1,1)">null 75 view2=View.inflate(MainActivity. 76 view3=View.inflate(MainActivity. 77 view4=View.inflate(MainActivity. 78 viewList.add(view1); 79 viewList.add(view2); 80 viewList.add(view3); 81 viewList.add(view4); 82 83 84 85 设置适配器 86 ImageAdapter adapter=new ImageAdapter(viewList); 87 88 绑定适配器 89 viewPager.setAdapter(adapter); 90 91 设置页卡切换监听 92 viewPager.setOnPageChangeListener( 93 94 95 96 97 void onPageScrollStateChanged(int arg0) { 98 99 100 101 102 void onPageScrolled(int arg0,1)">float arg1,1)"> arg2) { 103 104 105 106 107 void onPageSelected(int position ) {当前页卡被选择时,position为当前页数 108 109 if(position==3){由于进入微信这个按钮在第4个页面(view)才会出现,如果一开始就加载这个按钮监听,就导致空指针异常 110 startButton=(Button) findViewById(R.id.startbutton); 111 startButton.setOnClickListener(new OnClickListener() {匿名内部类,区分小圆圈的点击事件 112 113 @Override 114 onClick(View v) { 115 Toast.makeText(MainActivity.,Toast.LENGTH_SHORT).show(); 116 } 117 }); 118 119 points[position].setEnabled(不可点 120 points[currentIndex].setEnabled(恢复之前页面状态 121 currentIndex=position; 122 123 124 125 126 127 利用刚设置的标识符@R_15_404@面 128 Log.i("tuzi",v.getTag()+""); 129 viewPager.setCurrentItem(() v.getTag()); 130 131 132 133 } ? ImageAdapter.java(适配器类) 2 3 4 5 android.support.v4.view.PagerAdapter; 7 android.view.ViewGroup; 8 class ImageAdapter extends PagerAdapter { 10 list; 11 public ImageAdapter(List<View> list) { 利用构造器接收list集合参数 this.list =15 返回页卡数量 if (list.size() != 0) { 19 return list.size(); 20 21 22 23 24 25 判断是否为view对象 26 return arg0==arg1;官方demo给出的建议写法 27 28 29 30 public Object instantiateItem(ViewGroup container,1)">实例化一个页卡,view对象存放在ViewGroup里 31 container.addView(list.get(position)); 32 list.get(position); 33 34 35 36 void destroyItem(ViewGroup container,1)">销毁一个页卡 37 container.removeView(list.get(position)); 38 39 40 } ? XML布局文件这里就不都贴出来了,就是简简单单的设置图片,文字按钮等 只贴其中比较特别的view: ? 主界面xml(activity_main.xml): RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height 5 tools:context="com.example.wx_viewpagertest.MainActivity" > 6 8 9 10 /> LinearLayout 13 ="@+id/ll" 14 ="wrap_content" 15 16 android:layout_alignParentBottom="true" 17 android:layout_centerHorizontal18 android:layout_marginBottom="20dp" 19 android:orientation="horizontal" 20 ImageView 22 ="@+id/iv1" 23 android:layout_width24 android:layout_height25 android:layout_gravity="center_vertical" 26 android:clickable27 android:padding="25dp" 28 android:src="@drawable/point_selector" 29 30 31 ="@+id/iv2" 32 33 34 35 36 37 38 39 40 ="@+id/iv3" 41 42 43 44 45 46 47 48 49 ="@+id/iv4" 50 51 52 53 54 55 56 </LinearLayout57 58 RelativeLayout> ? ? 最后一个页面带进入按钮的xml(view4.xml): <?xml version="1.0" encoding="UTF-8"?> 2 android:background="@drawable/v4" 6 android:orientation="vertical" 7 8 TextView 9 ="@+id/starttext" 11 12 android:layout_alignParentTop13 android:gravity="center" android:layout_marginTop="80dp" android:text="微信,是一种生活方式" android:textColor="@android:color/white" android:textSize="20dp" 19 20 Button 21 ="@+id/startbutton" 22 android:background="@drawable/startbutton_selector" ="@string/start" 29 30 ="18dp" 31 32 33 34 > ? 这里还有个选择器,自定义小圆圈和Button按钮样式: 小圆圈: xml version="1.0" encoding="utf-8"selector ="http://schemas.android.com/apk/res/android" 3 4 item 5 android:state_enabled="true" android:drawable="@drawable/v_point_nor" 6 ></item 7 9 ="false"="@drawable/v_point_pre" 10 12 selector> 自定义按钮: 1 2 ="http://schemas.android.com/apk/res/android"3 item android:state_pressed android:drawable="@drawable/v_btn_pressed" /> 5 ="@drawable/v_btn_nor" /> 6 > ? ? 好了,核心代码都给出了,注释已经很业界良心了~ See you! ? 作者:Balla_兔子 (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |