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

来源:互联网 发布:batch随机梯度下降算法 编辑:程序博客网 时间:2024/05/17 03:26

首先申明,本系列【Android UI设计与开发】都为转载而来,为了方便自己学习查看,同时也方便大家共同学习前辈们积累的知识,特此转载本系列教程。本系列出处jingqing,

空间链接为:http://www.apkbus.com/home.php?mod=space&uid=659&do=index,jingqing空间中还有更多经典的教程!


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

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


一、实现的效果图


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






二、编码前的准备工作


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


三、项目结构图




四、具体的编码实现


1、  布局界面比较简单,加入ViewPager组件,以及底部的引导小点,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="wrap_content"
  4.     android:layout_height="wrap_content">

  5.      <android.support.v4.view.ViewPager
  6.         android:id="@+id/viewpager"
  7.         android:layout_width="fill_parent"
  8.         android:layout_height="fill_parent" />

  9.      <LinearLayout
  10.         android:id="@+id/ll"
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:layout_alignParentBottom="true"
  14.         android:layout_centerHorizontal="true"
  15.         android:layout_marginBottom="24.0dip"
  16.         android:orientation="horizontal">

  17.         <ImageView
  18.             android:layout_width="wrap_content"
  19.             android:layout_height="wrap_content"
  20.             android:layout_gravity="center_vertical"
  21.             android:clickable="true"
  22.             android:padding="15.0dip"
  23.             android:src="@drawable/point"/>
  24.         <ImageView
  25.             android:layout_width="wrap_content"
  26.             android:layout_height="wrap_content"
  27.             android:layout_gravity="center_vertical"
  28.             android:clickable="true"
  29.             android:padding="15.0dip"
  30.             android:src="@drawable/point"/>
  31.         <ImageView
  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="15.0dip"
  37.             android:src="@drawable/point"/>
  38.         <ImageView
  39.             android:layout_width="wrap_content"
  40.             android:layout_height="wrap_content"
  41.             android:layout_gravity="center_vertical"
  42.             android:clickable="true"
  43.             android:padding="15.0dip"
  44.             android:src="@drawable/point"/>
  45.     </LinearLayout>
  46. </RelativeLayout>
复制代码
2、其中小点的图片用一个selector来控制颜色,point.xml:
  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:
  1. package com.yangyu;

  2. import java.util.ArrayList;

  3. import android.support.v4.view.PagerAdapter;
  4. import android.support.v4.view.ViewPager;
  5. import android.view.View;

  6. /**
  7. * @author yangyu
  8. *  功能描述:ViewPager适配器,用来绑定数据和view
  9. */
  10. public class ViewPagerAdapter extends PagerAdapter {
  11.         
  12.         //界面列表
  13.     private ArrayList<View> views;
  14.     
  15.     public ViewPagerAdapter (ArrayList<View> views){
  16.         this.views = views;
  17.     }
  18.        
  19.         /**
  20.          * 获得当前界面数
  21.          */
  22.         @Override
  23.         public int getCount() {
  24.                  if (views != null) {
  25.              return views.size();
  26.          }      
  27.          return 0;
  28.         }

  29.         /**
  30.          * 初始化position位置的界面
  31.          */
  32.     @Override
  33.     public Object instantiateItem(View view, int position) {
  34.        
  35.         ((ViewPager) view).addView(views.get(position), 0);
  36.        
  37.         return views.get(position);
  38.     }
  39.     
  40.     /**
  41.          * 判断是否由对象生成界面
  42.          */
  43.         @Override
  44.         public boolean isViewFromObject(View view, Object arg1) {
  45.                 return (view == arg1);
  46.         }

  47.         /**
  48.          * 销毁position位置的界面
  49.          */
  50.     @Override
  51.     public void destroyItem(View view, int position, Object arg2) {
  52.         ((ViewPager) view).removeView(views.get(position));       
  53.     }
  54. }
复制代码
4、主程序入口类,MainActivity.java:
  1. package com.yangyu;

  2. import java.util.ArrayList;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.support.v4.view.ViewPager;
  6. import android.support.v4.view.ViewPager.OnPageChangeListener;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.ImageView;
  10. import android.widget.LinearLayout;

  11. import com.example.myguideview01.R;

  12. /**
  13. * @author yangyu
  14. *  功能描述:主程序入口类
  15. */
  16. public class MainActivity extends Activity implements OnClickListener,OnPageChangeListener {
  17.         //定义ViewPager对象
  18.         private ViewPager viewPager;
  19.         
  20.         //定义ViewPager适配器
  21.         private ViewPagerAdapter vpAdapter;
  22.         
  23.         //定义一个ArrayList来存放View
  24.         private ArrayList<View> views;

  25.         //引导图片资源
  26.         private static final int[] pics = {R.drawable.guide1,R.drawable.guide2,R.drawable.guide3,R.drawable.guide4};
  27.     
  28.         //底部小点的图片
  29.         private ImageView[] points;
  30.     
  31.         //记录当前选中位置
  32.         private int currentIndex;
  33.     
  34.         @Override
  35.         protected void onCreate(Bundle savedInstanceState) {
  36.                 super.onCreate(savedInstanceState);
  37.                 setContentView(R.layout.activity_main);
  38.                 
  39.                 initView();
  40.                 
  41.                 initData();        
  42.         }

  43.         /**
  44.          * 初始化组件
  45.          */
  46.         private void initView(){
  47.                 //实例化ArrayList对象
  48.                 views = new ArrayList<View>();
  49.                 
  50.                 //实例化ViewPager
  51.                 viewPager = (ViewPager) findViewById(R.id.viewpager);
  52.                 
  53.                 //实例化ViewPager适配器
  54.                 vpAdapter = new ViewPagerAdapter(views);
  55.         }
  56.         
  57.         /**
  58.          * 初始化数据
  59.          */
  60.         private void initData(){
  61.                 //定义一个布局并设置参数
  62.                 LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
  63.                                                                                                                                   LinearLayout.LayoutParams.FILL_PARENT);
  64.        
  65.         //初始化引导图片列表
  66.         for(int i=0; i<pics.length; i++) {
  67.             ImageView iv = new ImageView(this);
  68.             iv.setLayoutParams(mParams);
  69.             iv.setImageResource(pics[i]);
  70.             views.add(iv);
  71.         } 
  72.         
  73.         //设置数据
  74.         viewPager.setAdapter(vpAdapter);
  75.         //设置监听
  76.         viewPager.setOnPageChangeListener(this);
  77.         
  78.         //初始化底部小点
  79.         initPoint();
  80.         }
  81.         
  82.         /**
  83.          * 初始化底部小点
  84.          */
  85.         private void initPoint(){
  86.                 LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);       
  87.                 
  88.         points = new ImageView[pics.length];

  89.         //循环取得小点图片
  90.         for (int i = 0; i < pics.length; i++) {
  91.                 //得到一个LinearLayout下面的每一个子元素
  92.                 points[i] = (ImageView) linearLayout.getChildAt(i);
  93.                 //默认都设为灰色
  94.                 points[i].setEnabled(true);
  95.                 //给每个小点设置监听
  96.                 points[i].setOnClickListener(this);
  97.                 //设置位置tag,方便取出与当前位置对应
  98.                 points[i].setTag(i);
  99.         }
  100.         
  101.         //设置当面默认的位置
  102.         currentIndex = 0;
  103.         //设置为白色,即选中状态
  104.         points[currentIndex].setEnabled(false);
  105.         }
  106.         
  107.         /**
  108.          * 当滑动状态改变时调用
  109.          */
  110.         @Override
  111.         public void onPageScrollStateChanged(int arg0) {

  112.         }
  113.         
  114.         /**
  115.          * 当当前页面被滑动时调用
  116.          */

  117.         @Override
  118.         public void onPageScrolled(int arg0, float arg1, int arg2) {

  119.         }
  120.         
  121.         /**
  122.          * 当新的页面被选中时调用
  123.          */

  124.         @Override
  125.         public void onPageSelected(int position) {
  126.                 //设置底部小点选中状态
  127.         setCurDot(position);
  128.         }

  129.         /**
  130.          * 通过点击事件来切换当前的页面
  131.          */
  132.         @Override
  133.         public void onClick(View v) {
  134.                  int position = (Integer)v.getTag();
  135.          setCurView(position);
  136.          setCurDot(position);                
  137.         }

  138.         /**
  139.          * 设置当前页面的位置
  140.          */
  141.         private void setCurView(int position){
  142.          if (position < 0 || position >= pics.length) {
  143.              return;
  144.          }
  145.          viewPager.setCurrentItem(position);
  146.      }

  147.      /**
  148.      * 设置当前的小点的位置
  149.      */
  150.     private void setCurDot(int positon){
  151.          if (positon < 0 || positon > pics.length - 1 || currentIndex == positon) {
  152.              return;
  153.          }
  154.          points[positon].setEnabled(false);
  155.          points[currentIndex].setEnabled(true);

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

由于不知怎么上传源码,所以弄了个源码下载链接:http://download.csdn.net/detail/yinboliu/7153683,望见谅!

0 0
原创粉丝点击