Android 启动引导页(动态生成底部导航圆点)【转】

来源:互联网 发布:python算法精解 pdf 编辑:程序博客网 时间:2024/04/30 12:29

来自:http://blog.csdn.net/ywl5320/article/details/38413101

工作快半年了,想把工作中的一些有用的东西分享分享,于是想到了写博客,方便别人查看,也方便自己记录点滴。好了,客套话不多说。今天我要分享的是“android 启动引导页”效果的实现,底部的导航圆点根据引导页的数量动态生成,不是在布局文件里写死了的,主要用到了ViewPager这个类。先看看效果:




详细实现步骤如下:

第一:准备图片资源,这里我准备了几张火影忍者的图片(5张)


和小圆点是否选中的两张图片

              

项目目录如下:



第二:先编写布局文件activity_main.xml。里面用到了ViewPager这个滑动组件,铺满整个窗体用于显示引导页的图片,还有一个居于底部的LinearLayout,用于动态添加引导图标(小圆点)。

[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="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="${relativePackage}.${activityClass}" >  
  6.   
  7.     <android.support.v4.view.ViewPager  
  8.         android:id="@+id/my_viewpager"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.         />  
  12.     <LinearLayout   
  13.         android:id="@+id/dot_layout"  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content"  
  16.         android:orientation="horizontal"  
  17.         android:layout_alignParentBottom="true"  
  18.         android:layout_centerHorizontal="true"  
  19.         android:gravity="center"  
  20.         android:layout_marginBottom="40dip"  
  21.         >  
  22.     </LinearLayout>  
  23.   
  24. </RelativeLayout>  


第三:编写导航小圆点的selector,分为选中和没选中两种状态。

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:drawable="@drawable/dot_normal" android:state_selected="false"/>  
  4.     <item android:drawable="@drawable/dot_selected" android:state_selected="true"/>  
  5. </selector>  


好了布局和基本selector已经完成,接下来就开始编写适配器和MainActivity。

第四:编写继承PagerAdapter的VpAdapter类的适配器,用于显示引导页图片,代码如下(有注解):

[java] view plain copy
  1. package com.vpdemo.viewpagerdemo;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.support.v4.view.PagerAdapter;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.ImageView;  
  9.   
  10. public class VpAdapter extends PagerAdapter {  
  11.       
  12.     private ArrayList<ImageView> imageViews;  
  13.       
  14.     public VpAdapter(ArrayList<ImageView> imageViews) {  
  15.         this.imageViews = imageViews;  
  16.     }  
  17.   
  18.     /** 
  19.      * 获取当前要显示对象的数量 
  20.      */  
  21.     @Override  
  22.     public int getCount() {  
  23.         // TODO Auto-generated method stub  
  24.         return imageViews.size();  
  25.     }  
  26.   
  27.     /** 
  28.      * 判断是否用对象生成界面 
  29.      */  
  30.     @Override  
  31.     public boolean isViewFromObject(View arg0, Object arg1) {  
  32.         // TODO Auto-generated method stub  
  33.         return arg0 == arg1;  
  34.     }  
  35.   
  36.     /** 
  37.      * 从ViewGroup中移除当前对象(图片) 
  38.      */  
  39.     @Override  
  40.     public void destroyItem(ViewGroup container, int position, Object object) {  
  41.         container.removeView(imageViews.get(position));  
  42.     }  
  43.       
  44.     /** 
  45.      * 当前要显示的对象(图片) 
  46.      */  
  47.     @Override  
  48.     public Object instantiateItem(ViewGroup container, int position) {  
  49.         container.addView(imageViews.get(position));  
  50.         return imageViews.get(position);  
  51.     }  
  52.       
  53. }  


第五:MainActivity实现了OnPageChangeListener接口,才能对滑动事件作出相应的反应。

[java] view plain copy
  1. package com.vpdemo.viewpagerdemo;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.graphics.drawable.Drawable;  
  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.ImageView;  
  13. import android.widget.Toast;  
  14. import android.widget.ImageView.ScaleType;  
  15. import android.widget.LinearLayout;  
  16. import android.widget.LinearLayout.LayoutParams;  
  17. import android.widget.TextView;  
  18.   
  19. public class MainActivity extends Activity implements OnPageChangeListener{  
  20.       
  21.     private ViewPager vPager;  
  22.     private VpAdapter vpAdapter;  
  23.     private static int [] imgs = {R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5};//要显示的图片资源  
  24.     private ArrayList<ImageView> imageViews;//用于包含引导页要显示的图片  
  25.     private ImageView[] dotViews;//用于包含底部小圆点的图片,只要设置每个imageview的图片资源为刚刚写的dot_selector,选择和没选中就会有不同的效果,实现导航的功能。  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_main);  
  31.         vPager = (ViewPager)findViewById(R.id.my_viewpager);  
  32.           
  33.         initImages();  
  34.         initDots();  
  35.           
  36.         vpAdapter = new VpAdapter(imageViews);  
  37.         vPager.setAdapter(vpAdapter);  
  38.         vPager.setOnPageChangeListener(this);  
  39.     }  
  40.   
  41.     /** 
  42.      * 把引导页要显示的图片添加到集合中,以传递给适配器,用来显示图片。 
  43.      */  
  44.       
  45.     private void initImages()  
  46.     {  
  47.         LayoutParams mParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);//设置每一张图片都填充窗口  
  48.         imageViews = new ArrayList<ImageView>();  
  49.           
  50.         for(int i = 0; i < imgs.length; i++)  
  51.         {  
  52.             ImageView iv = new ImageView(this);  
  53.             iv.setLayoutParams(mParams);//设置布局  
  54.             iv.setImageResource(imgs[i]);//为Imageview添加图片资源  
  55.             iv.setScaleType(ScaleType.FIT_XY);//设置图片拉伸效果  
  56.             imageViews.add(iv);  
  57.             if(i== imgs.length - 1)//为最后一张添加点击事件  
  58.             {  
  59.                 iv.setOnClickListener(new OnClickListener() {  
  60.                       
  61.                     @Override  
  62.                     public void onClick(View v) {  
  63.                         Toast.makeText(MainActivity.this"跳转。。。", Toast.LENGTH_SHORT).show();  
  64.                     }  
  65.                 });  
  66.             }  
  67.         }  
  68.     }  
  69.       
  70.     /** 
  71.      * 根据引导页的数量,动态生成相应数量的导航小圆点,并添加到LinearLayout中显示。 
  72.      */  
  73.     private void initDots()  
  74.     {  
  75.         LinearLayout layout = (LinearLayout)findViewById(R.id.dot_layout);  
  76.         LayoutParams mParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  77.         mParams.setMargins(100100);//设置小圆点左右之间的间隔  
  78.           
  79.         dotViews = new ImageView[imgs.length];  
  80.           
  81.         for(int i = 0; i < imageViews.size(); i++)  
  82.         {  
  83.             ImageView imageView = new ImageView(this);  
  84.             imageView.setLayoutParams(mParams);  
  85.             imageView.setImageResource(R.drawable.dot_selector);  
  86.             if(i== 0)  
  87.             {  
  88.                 imageView.setSelected(true);//默认启动时,选中第一个小圆点  
  89.             }  
  90.             else {  
  91.                 imageView.setSelected(false);  
  92.             }  
  93.             dotViews[i] = imageView;//得到每个小圆点的引用,用于滑动页面时,(onPageSelected方法中)更改它们的状态。  
  94.             layout.addView(imageView);//添加到布局里面显示  
  95.         }  
  96.           
  97.     }  
  98.       
  99.       
  100.     @Override  
  101.     public void onPageScrollStateChanged(int arg0) {  
  102.         // TODO Auto-generated method stub  
  103.           
  104.     }  
  105.   
  106.     @Override  
  107.     public void onPageScrolled(int arg0, float arg1, int arg2) {  
  108.         // TODO Auto-generated method stub  
  109.           
  110.     }  
  111.   
  112.     /** 
  113.      * arg0:当前滑动显示页面的索引值,可以根据这个值,来设置相应小圆点的状态。 
  114.      */  
  115.     @Override  
  116.     public void onPageSelected(int arg0) {  
  117.         for(int i = 0; i < dotViews.length; i++)  
  118.         {  
  119.             if(arg0 == i)  
  120.             {  
  121.                 dotViews[i].setSelected(true);  
  122.             }  
  123.             else {  
  124.                 dotViews[i].setSelected(false);  
  125.             }  
  126.         }  
  127.           
  128.     }  
  129. }  


至此android 引导页效果就完成了。

最后是点击最后一个页面跳转到其他页面的效果:


OK,有待优化和不足的地方希望大家多多提出,共同进步,哈哈哈!

0 0