• 安卓开发笔记——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     @Override
     7     public boolean isViewFromObject(View arg0, Object arg1) {//判断是否是view对象
     8         return false;
     9     }
    10     
    11     @Override
    12     public Object instantiateItem(View container, int position) {//实例化一个页面
    13         return super.instantiateItem(container, position);
    14     }
    15     
    16     @Override
    17     public void destroyItem(View container, int position, Object object) {//销毁一个页面
    18         super.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 import java.util.List;
      5 
      6 import android.app.Activity;
      7 import android.os.Bundle;
      8 import android.support.v4.view.ViewPager;
      9 import android.support.v4.view.ViewPager.OnPageChangeListener;
     10 import android.view.View;
     11 import android.view.View.OnClickListener;
     12 import android.widget.Button;
     13 import android.widget.ImageView;
     14 import android.widget.LinearLayout;
     15 import android.widget.Toast;
     16 
     17 public 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     private View view1, view2, view3, view4;
     23     private ImageView points[];//存放小圆圈数组 
     24     
     25     private int currentIndex=0;//当前页面,默认首页
     26     
     27     private Button startButton;
     28     
     29 
     30     @Override
     31     protected void onCreate(Bundle savedInstanceState) {
     32         super.onCreate(savedInstanceState);
     33         setContentView(R.layout.activity_main);
     34         initViewPager();//初始化ViewPager对象
     35         initPoint();//初始化导航小圆点
     36     }
     37 
     38     private void 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     private void 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, null);
     75         view2=View.inflate(MainActivity.this, R.layout.view2, null);
     76         view3=View.inflate(MainActivity.this, R.layout.view3, null);
     77         view4=View.inflate(MainActivity.this, R.layout.view4, null);
     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(this);
     93         
     94     }
     95 
     96     @Override
     97     public void onPageScrollStateChanged(int arg0) {
     98         
     99     }
    100 
    101     @Override
    102     public void onPageScrolled(int arg0, float arg1, int arg2) {
    103         
    104     }
    105 
    106     @Override
    107     public 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                 public void onClick(View v) {
    115                     Toast.makeText(MainActivity.this, "欢迎进入微信世界", Toast.LENGTH_SHORT).show();
    116                 }
    117             });
    118         }
    119         points[position].setEnabled(false);//不可点
    120         points[currentIndex].setEnabled(true);//恢复之前页面状态
    121         currentIndex=position;
    122         
    123     }
    124 
    125     @Override
    126     public void onClick(View v) {
    127         //利用刚设置的标识符跳转页面
    128         //Log.i("tuzi",v.getTag()+"");
    129         viewPager.setCurrentItem((int) v.getTag());
    130         
    131     }
    132 
    133 }

    ImageAdapter.java(适配器类)

     1 package com.example.wx_viewpagertest;
     2 
     3 import java.util.List;
     4 
     5 import android.support.v4.view.PagerAdapter;
     6 import android.view.View;
     7 import android.view.ViewGroup;
     8 
     9 public class ImageAdapter extends PagerAdapter {
    10     private List<View> list;
    11 
    12     public ImageAdapter(List<View> list) {// 利用构造器接收list集合参数
    13         this.list = list;
    14     }
    15 
    16     @Override
    17     public int getCount() {// 返回页卡数量
    18         if (list.size() != 0) {
    19             return list.size();
    20         }
    21         return 0;
    22     }
    23 
    24     @Override
    25     public boolean isViewFromObject(View arg0, Object arg1) {//判断是否为view对象
    26         return arg0==arg1;//官方demo给出的建议写法
    27     }
    28     
    29     @Override
    30     public Object instantiateItem(ViewGroup container, int position) {//实例化一个页卡,view对象存放在ViewGroup里
    31         container.addView(list.get(position));
    32         return list.get(position);
    33     }
    34     
    35     @Override
    36     public void destroyItem(ViewGroup container, int position, Object object) {//销毁一个页卡
    37         container.removeView(list.get(position));
    38     }
    39 
    40 }

    XML布局文件这里就不都贴出来了,就是简简单单的设置图片,文字按钮等

    只贴其中比较特别的view:

    主界面xml(activity_main.xml):

     1 <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="match_parent"
     5     tools:context="com.example.wx_viewpagertest.MainActivity" >
     6 
     7     <android.support.v4.view.ViewPager
     8         android:id="@+id/viewpager"
     9         android:layout_width="fill_parent"
    10         android:layout_height="fill_parent" />
    11 
    12     <LinearLayout
    13         android:id="@+id/ll"
    14         android:layout_width="wrap_content"
    15         android:layout_height="wrap_content"
    16         android:layout_alignParentBottom="true"
    17         android:layout_centerHorizontal="true"
    18         android:layout_marginBottom="20dp"
    19         android:orientation="horizontal" >
    20 
    21         <ImageView
    22             android:id="@+id/iv1"
    23             android:layout_width="wrap_content"
    24             android:layout_height="wrap_content"
    25             android:layout_gravity="center_vertical"
    26             android:clickable="true"
    27             android:padding="25dp"
    28             android:src="@drawable/point_selector" />
    29 
    30         <ImageView
    31             android:id="@+id/iv2"
    32             android:layout_width="wrap_content"
    33             android:layout_height="wrap_content"
    34             android:layout_gravity="center_vertical"
    35             android:clickable="true"
    36             android:padding="25dp"
    37             android:src="@drawable/point_selector" />
    38 
    39         <ImageView
    40             android:id="@+id/iv3"
    41             android:layout_width="wrap_content"
    42             android:layout_height="wrap_content"
    43             android:layout_gravity="center_vertical"
    44             android:clickable="true"
    45             android:padding="25dp"
    46             android:src="@drawable/point_selector" />
    47 
    48         <ImageView
    49             android:id="@+id/iv4"
    50             android:layout_width="wrap_content"
    51             android:layout_height="wrap_content"
    52             android:layout_gravity="center_vertical"
    53             android:clickable="true"
    54             android:padding="25dp"
    55             android:src="@drawable/point_selector" />
    56     </LinearLayout>
    57 
    58 </RelativeLayout>

    最后一个页面带进入按钮的xml(view4.xml):

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"
     5     android:background="@drawable/v4"
     6     android:orientation="vertical" >
     7 
     8     <TextView
     9         android:id="@+id/starttext"
    10         android:layout_width="fill_parent"
    11         android:layout_height="wrap_content"
    12         android:layout_alignParentTop="true"
    13         android:layout_centerHorizontal="true"
    14         android:gravity="center"
    15         android:layout_marginTop="80dp"
    16         android:text="微信,是一种生活方式"
    17         android:textColor="@android:color/white"
    18         android:textSize="20dp" />
    19 
    20     <Button
    21         android:id="@+id/startbutton"
    22         android:layout_width="wrap_content"
    23         android:layout_height="wrap_content"
    24         android:layout_alignParentBottom="true"
    25         android:layout_centerHorizontal="true"
    26         android:layout_marginBottom="80dp"
    27         android:background="@drawable/startbutton_selector"
    28         android:text="@string/start"
    29         android:textColor="@android:color/white"
    30         android:textSize="18dp" />
    31     
    32 
    33 
    34 </RelativeLayout>

    这里还有个选择器,自定义小圆圈和Button按钮样式:

    小圆圈:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <selector xmlns:android="http://schemas.android.com/apk/res/android" >
     3     
     4     <item 
     5         android:state_enabled="true" android:drawable="@drawable/v_point_nor"
     6         ></item>
     7     
     8     <item 
     9          android:state_enabled="false" android:drawable="@drawable/v_point_pre"
    10         ></item>
    11 
    12 </selector>

    自定义按钮:

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3     <item android:state_enabled="true" android:state_pressed="true"
    4         android:drawable="@drawable/v_btn_pressed" />    
    5     <item android:state_enabled="true" android:drawable="@drawable/v_btn_nor" />  
    6 </selector>

    好了,核心代码都给出了,注释已经很业界良心了~ See you!

    作者:Balla_兔子
    出处:http://www.cnblogs.com/lichenwei/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

  • 相关阅读:
    201504051930_《移动APP框架——MUI——HTML5》
    201503121644_《ios直播协议相关》
    2010502260926_《avolon》
    201502251333_《avolon作用域》
    201502251308_《fekit》
    使用Eclipse下载CRaSH源代码
    网络流量监控工具
    Map的putAll方法验证
    bat脚本中%~dp0含义解释
    CD管理和检索软件比较
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3970053.html
Copyright © 2020-2023  润新知