【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

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

      本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗?

      最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题。


一、实现的效果图


        也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似,有图才有真相嘛,呵呵。






二、编码前的准备工作


       ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。大家搜下即可。


三、项目结构图




四、具体的编码实现


1、  布局界面比较简单,加入ViewPager组件,以及底部的引导小点,activity_main.xml:

[html]  view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content">  
  5.   
  6.      <android.support.v4.view.ViewPager  
  7.         android:id="@+id/viewpager"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent" />  
  10.   
  11.      <LinearLayout  
  12.         android:id="@+id/ll"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_alignParentBottom="true"  
  16.         android:layout_centerHorizontal="true"  
  17.         android:layout_marginBottom="24.0dip"  
  18.         android:orientation="horizontal">  
  19.    
  20.         <ImageView  
  21.             android:layout_width="wrap_content"  
  22.             android:layout_height="wrap_content"  
  23.             android:layout_gravity="center_vertical"  
  24.             android:clickable="true"  
  25.             android:padding="15.0dip"  
  26.             android:src="@drawable/point"/>  
  27.         <ImageView  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content"  
  30.             android:layout_gravity="center_vertical"  
  31.             android:clickable="true"  
  32.             android:padding="15.0dip"  
  33.             android:src="@drawable/point"/>  
  34.         <ImageView  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content"  
  37.             android:layout_gravity="center_vertical"  
  38.             android:clickable="true"  
  39.             android:padding="15.0dip"  
  40.             android:src="@drawable/point"/>  
  41.         <ImageView  
  42.             android:layout_width="wrap_content"  
  43.             android:layout_height="wrap_content"  
  44.             android:layout_gravity="center_vertical"  
  45.             android:clickable="true"  
  46.             android:padding="15.0dip"  
  47.             android:src="@drawable/point"/>  
  48.     </LinearLayout>  
  49. </RelativeLayout>  
2、其中小点的图片用一个selector来控制颜色, point.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <selector  
  3.   xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <item android:state_enabled="true" android:drawable="@drawable/point_normal" />  
  5.     <item android:state_enabled="false" android:drawable="@drawable/point_select" />  
  6. </selector>  
3、 ViewPager适配器代码, ViewPagerAdapter.java:

[java]  view plain copy
  1. package com.yangyu;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.support.v4.view.PagerAdapter;  
  6. import android.support.v4.view.ViewPager;  
  7. import android.view.View;  
  8.   
  9. /** 
  10.  * @author yangyu 
  11.  *  功能描述:ViewPager适配器,用来绑定数据和view 
  12.  */  
  13. public class ViewPagerAdapter extends PagerAdapter {  
  14.       
  15.     //界面列表  
  16.     private ArrayList<View> views;  
  17.       
  18.     public ViewPagerAdapter (ArrayList<View> views){  
  19.         this.views = views;  
  20.     }  
  21.          
  22.     /** 
  23.      * 获得当前界面数 
  24.      */  
  25.     @Override  
  26.     public int getCount() {  
  27.          if (views != null) {  
  28.              return views.size();  
  29.          }        
  30.          return 0;  
  31.     }  
  32.   
  33.     /** 
  34.      * 初始化position位置的界面 
  35.      */  
  36.     @Override  
  37.     public Object instantiateItem(View view, int position) {  
  38.          
  39.         ((ViewPager) view).addView(views.get(position), 0);  
  40.          
  41.         return views.get(position);  
  42.     }  
  43.       
  44.     /** 
  45.      * 判断是否由对象生成界面 
  46.      */  
  47.     @Override  
  48.     public boolean isViewFromObject(View view, Object arg1) {  
  49.         return (view == arg1);  
  50.     }  
  51.   
  52.     /** 
  53.      * 销毁position位置的界面 
  54.      */  
  55.     @Override  
  56.     public void destroyItem(View view, int position, Object arg2) {  
  57.         ((ViewPager) view).removeView(views.get(position));         
  58.     }  
  59. }  
4、主程序入口类,MainActivity.java:

[java]  view plain copy
  1. package com.yangyu;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.support.v4.view.ViewPager;  
  8. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.ImageView;  
  12. import android.widget.LinearLayout;  
  13.   
  14. import com.example.myguideview01.R;  
  15.   
  16. /** 
  17.  * @author yangyu 
  18.  *  功能描述:主程序入口类 
  19.  */  
  20. public class MainActivity extends Activity implements OnClickListener,OnPageChangeListener {  
  21.     //定义ViewPager对象  
  22.     private ViewPager viewPager;  
  23.       
  24.     //定义ViewPager适配器  
  25.     private ViewPagerAdapter vpAdapter;  
  26.       
  27.     //定义一个ArrayList来存放View  
  28.     private ArrayList<View> views;  
  29.   
  30.     //引导图片资源  
  31.         private static final int[] pics = {R.drawable.guide1,R.drawable.guide2,R.drawable.guide3,R.drawable.guide4};  
  32.       
  33.         //底部小点的图片  
  34.         private ImageView[] points;  
  35.       
  36.         //记录当前选中位置  
  37.         private int currentIndex;  
  38.       
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_main);  
  43.           
  44.         initView();  
  45.           
  46.         initData();   
  47.     }  
  48.   
  49.     /** 
  50.      * 初始化组件 
  51.      */  
  52.     private void initView(){  
  53.         //实例化ArrayList对象  
  54.         views = new ArrayList<View>();  
  55.           
  56.         //实例化ViewPager  
  57.         viewPager = (ViewPager) findViewById(R.id.viewpager);  
  58.           
  59.         //实例化ViewPager适配器  
  60.         vpAdapter = new ViewPagerAdapter(views);  
  61.     }  
  62.       
  63.     /** 
  64.      * 初始化数据 
  65.      */  
  66.     private void initData(){  
  67.         //定义一个布局并设置参数  
  68.         LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,  
  69.                                                                           LinearLayout.LayoutParams.FILL_PARENT);  
  70.          
  71.         //初始化引导图片列表  
  72.         for(int i=0; i<pics.length; i++) {  
  73.             ImageView iv = new ImageView(this);  
  74.             iv.setLayoutParams(mParams);  
  75.             iv.setImageResource(pics[i]);  
  76.             views.add(iv);  
  77.         }   
  78.           
  79.         //设置数据  
  80.         viewPager.setAdapter(vpAdapter);  
  81.         //设置监听  
  82.         viewPager.setOnPageChangeListener(this);  
  83.           
  84.         //初始化底部小点  
  85.         initPoint();  
  86.     }  
  87.       
  88.     /** 
  89.      * 初始化底部小点 
  90.      */  
  91.     private void initPoint(){  
  92.         LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);         
  93.           
  94.         points = new ImageView[pics.length];  
  95.   
  96.         //循环取得小点图片  
  97.         for (int i = 0; i < pics.length; i++) {  
  98.             //得到一个LinearLayout下面的每一个子元素  
  99.             points[i] = (ImageView) linearLayout.getChildAt(i);  
  100.             //默认都设为灰色  
  101.             points[i].setEnabled(true);  
  102.             //给每个小点设置监听  
  103.             points[i].setOnClickListener(this);  
  104.             //设置位置tag,方便取出与当前位置对应  
  105.             points[i].setTag(i);  
  106.         }  
  107.           
  108.         //设置当面默认的位置  
  109.         currentIndex = 0;  
  110.         //设置为白色,即选中状态  
  111.         points[currentIndex].setEnabled(false);  
  112.     }  
  113.       
  114.     /** 
  115.      * 当滑动状态改变时调用 
  116.      */  
  117.     @Override  
  118.     public void onPageScrollStateChanged(int arg0) {  
  119.   
  120.     }  
  121.       
  122.     /** 
  123.      * 当当前页面被滑动时调用 
  124.      */  
  125.   
  126.     @Override  
  127.     public void onPageScrolled(int arg0, float arg1, int arg2) {  
  128.   
  129.     }  
  130.       
  131.     /** 
  132.      * 当新的页面被选中时调用 
  133.      */  
  134.   
  135.     @Override  
  136.     public void onPageSelected(int position) {  
  137.         //设置底部小点选中状态  
  138.         setCurDot(position);  
  139.     }  
  140.   
  141.     /** 
  142.      * 通过点击事件来切换当前的页面 
  143.      */  
  144.     @Override  
  145.     public void onClick(View v) {  
  146.          int position = (Integer)v.getTag();  
  147.          setCurView(position);  
  148.          setCurDot(position);         
  149.     }  
  150.   
  151.     /** 
  152.      * 设置当前页面的位置 
  153.      */  
  154.     private void setCurView(int position){  
  155.          if (position < 0 || position >= pics.length) {  
  156.              return;  
  157.          }  
  158.          viewPager.setCurrentItem(position);  
  159.      }  
  160.   
  161.      /** 
  162.      * 设置当前的小点的位置 
  163.      */  
  164.     private void setCurDot(int positon){  
  165.          if (positon < 0 || positon > pics.length - 1 || currentIndex == positon) {  
  166.              return;  
  167.          }  
  168.          points[positon].setEnabled(false);  
  169.          points[currentIndex].setEnabled(true);  
  170.   
  171.          currentIndex = positon;  
  172.      }    
  173. }  

         这篇主要是让大家能够实现一个简单的例子,让你的程序先动起来,才有信心和勇气挑战更复杂的UI设计和开发,在后面的几篇章节中,博主也会以同样生动和富有激情的讲解,给大家带来更加的复杂的演示和代码,如仿微信、和人人网的引导界面的开发,加入了动画的效果,运行起来也会更炫一点。


源码下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值