加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

安卓开发笔记——ViewPager组件(仿微信引导界面)

发布时间:2021-05-21 05:07:48 所属栏目:大数据 来源: https://www.jb51.cc
导读:这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ? 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果。 如果想向下兼容就必须要 android-support

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

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读