Android 高级UI设计笔记22:Android 指示引导页(带圆点)
1. 引导页:
我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果:
2. 引导页具体实现功能如下:
- 可以左右滑动图片。
- 图片的索引圆点显示,看出当前图片所在的位置和图片的数量。
- 可任意左右滑动。
- 图片的索引圆点带有动画效果。
- 最后一页显示按钮,点击进入应用。
3. 引导页实现逻辑过程:
利用ViewPager实现用户引导界面。
在这里,我们需要用到google提到的一个支持包—Android-support-v4.jar,这个包包含了一些非常有用的类,其中ViewPager类来实现页面之间的切换操作。
(1)首先是布局文件activity_main.xml,这里我用相对布局,全屏放一个viewpager,用一个viewGroup(LinearLayout)在底部来放置圆点View,在viewpager的上面。最后再放一个Button,位置在LinearLayout的上面,设置为visibility="gone",当滑动到最后一页就显示,布局搞定。
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" > 6 7 <android.support.v4.view.ViewPager 8 android:id="@+id/first_viewpager" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" > 11 </android.support.v4.view.ViewPager> 12 13 <LinearLayout 14 android:id="@+id/viewpager_tag_viewgroup" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:layout_alignParentBottom="true" 18 android:layout_marginBottom="40dp" 19 android:gravity="center_horizontal" 20 android:orientation="horizontal" > 21 </LinearLayout> 22 23 <Button 24 android:id="@+id/view_pager_button" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:layout_above="@id/viewpager_tag_viewgroup" 28 android:layout_centerHorizontal="true" 29 android:text="立即体验" 30 android:visibility="gone" /> 31 32 </RelativeLayout>
(2)接下来为ViewPager准备好Adapter,如下:
1 package com.himi.guidedemo; 2 3 import java.util.List; 4 5 import android.support.v4.view.PagerAdapter; 6 import android.support.v4.view.ViewPager; 7 import android.view.View; 8 import android.view.ViewGroup; 9 10 /** 11 * ViewPager适配器 12 */ 13 public class GuidePagerAdapter extends PagerAdapter { 14 private List<View> viewList; 15 16 public GuidePagerAdapter(List<View> viewList) { 17 this.viewList = viewList; 18 } 19 /** 20 * 返回页面的个数 21 * 22 * @return 23 */ 24 @Override 25 public int getCount() { 26 if (viewList != null) { 27 return viewList.size(); 28 } 29 return 0; 30 } 31 32 /** 33 * 判断是否由对象生成界面 34 * 35 * @param view 36 * @param object 37 * @return 38 */ 39 @Override 40 public boolean isViewFromObject(View view, Object object) { 41 return view == object; 42 } 43 44 /** 45 * 初始化position位置的界面 46 * 47 * @param container 48 * @param position 49 * @return 50 */ 51 @Override 52 public Object instantiateItem(ViewGroup container, int position) { 53 ((ViewPager) container).addView(viewList.get(position), 0); 54 return viewList.get(position); 55 } 56 57 /** 58 * 移除页面 59 * 60 * @param container 61 * @param position 62 * @param object 63 */ 64 @Override 65 public void destroyItem(ViewGroup container, int position, Object object) { 66 ((ViewPager) container).removeView(viewList.get(position)); 67 } 68 }
备注:isViewFromObject方法是用来判断pager的一个view是否和instantiateItem方法返回的object有关联。
(3)接下来我们来到ViewPagerActivity,如下:
1 package com.himi.guidedemo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.content.Intent; 8 import android.os.Bundle; 9 import android.support.v4.view.ViewPager; 10 import android.view.View; 11 import android.view.ViewGroup; 12 import android.view.Window; 13 import android.view.WindowManager; 14 import android.widget.Button; 15 import android.widget.ImageView; 16 import android.widget.LinearLayout; 17 18 public class ViewPagerActivity extends Activity implements ViewPager.OnPageChangeListener { 19 20 private ViewPager mViewPager; 21 //图片资源的数组 22 private int[] mImageIdArray; 23 //图片的集合 24 private List<View> mViewList; 25 //放置圆点 26 private ViewGroup mViewGroup; 27 //实例化圆点View 28 private ImageView mImageView; 29 private ImageView[] mImageViewArray; 30 //最后一页的按钮 31 private Button mButton; 32 33 @Override 34 protected void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 37 requestWindowFeature(Window.FEATURE_NO_TITLE); 38 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 39 WindowManager.LayoutParams.FLAG_FULLSCREEN); 40 41 setContentView(R.layout.activity_main); 42 43 mButton = (Button) findViewById(R.id.view_pager_button); 44 mButton.setOnClickListener(new View.OnClickListener() { 45 @Override 46 public void onClick(View v) { 47 startActivity(new Intent(ViewPagerActivity.this, LoginActivity.class)); 48 finish(); 49 } 50 }); 51 //加载ViewPager 52 initViewpager(); 53 //加载底部圆点 54 initViewPagerTag(); 55 56 } 57 58 /** 59 * 加载底部圆点 60 */ 61 private void initViewPagerTag() { 62 //这里实例化LinearLayout 63 mViewGroup = (ViewGroup) findViewById(R.id.viewpager_tag_viewgroup); 64 //根据ViewPager的item数量实例化数组 65 mImageViewArray = new ImageView[mViewList.size()]; 66 //循环新建底部圆点imageview,将生成的imageview保存到数组中 67 for (int i = 0; i < mViewList.size(); i++) { 68 mImageView = new ImageView(this); 69 mImageView.setLayoutParams(new ViewGroup.LayoutParams(20, 20)); 70 mImageView.setPadding(30, 0, 30, 0); 71 mImageViewArray[i] = mImageView; 72 //第一个页面需要设为选中状态,这里要使用两张不同的图片(选中与未选中) 73 if (i == 0) { 74 mImageView.setBackgroundResource(R.drawable.page_indicator_focused); 75 } else { 76 mImageView.setBackgroundResource(R.drawable.page_indicator); 77 } 78 //将数组中的imageview加入到viewgroup 79 mViewGroup.addView(mImageViewArray[i]); 80 } 81 } 82 83 /** 84 * 加载ViewPager 85 */ 86 private void initViewpager() { 87 mViewPager = (ViewPager) findViewById(R.id.first_viewpager); 88 //实例化图片资源 89 mImageIdArray = new int[]{R.drawable.guide01, R.drawable.guide02, R.drawable.guide03, R.drawable.guide04, R.drawable.guide05}; 90 91 mViewList = new ArrayList<View>(); 92 //获取一个layout参数,设置为match_parent 93 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT 94 , LinearLayout.LayoutParams.MATCH_PARENT); 95 96 //循环创建view并进入集合 97 for (int i = 0; i < mImageIdArray.length; i++) { 98 //new imageview并设置全屏和图片资源 99 ImageView imageView = new ImageView(this); 100 imageView.setLayoutParams(params); 101 imageView.setBackgroundResource(mImageIdArray[i]); 102 103 //将imageview加入到View集合中 104 mViewList.add(imageView); 105 } 106 //View集合数据初始化好,setAdapter就可以了 107 mViewPager.setAdapter(new GuidePagerAdapter(mViewList)); 108 //添加ViewPager的滑动监听,注意是.add...以前是setOnPageChangeListener方法,已过时 109 mViewPager.addOnPageChangeListener(this); 110 } 111 112 @Override 113 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 114 115 } 116 //滑动后的监听 117 @Override 118 public void onPageSelected(int position) { 119 //循环设置当前页的标记图 120 for (int i = 0; i < mImageViewArray.length; i++) { 121 mImageViewArray[position].setBackgroundResource(R.drawable.page_indicator_focused); 122 if (position != i) { 123 mImageViewArray[i].setBackgroundResource(R.drawable.page_indicator); 124 } 125 } 126 //判断是否最后一页,是则显示button 127 if (position == mImageViewArray.length - 1) { 128 mButton.setVisibility(View.VISIBLE); 129 } else { 130 mButton.setVisibility(View.GONE); 131 } 132 } 133 134 @Override 135 public void onPageScrollStateChanged(int state) { 136 137 } 138 }
(4)当我们滑动到最后一张页面的时候,"立即体验"的按钮就会显示出来,我们点击这个按钮就可以进入登录界面。
package com.himi.guidedemo; import android.app.Activity; import android.os.Bundle; public class LoginActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.login); } }
对应的布局文件login.xml,如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:gravity="center" 7 tools:context=".guide.ViewPagerActivity" > 8 9 10 <TextView 11 android:text="欢迎来到登录页面" 12 android:gravity="center" 13 android:textSize="25sp" 14 android:layout_width="match_parent" 15 android:layout_height="wrap_content"/> 16 </RelativeLayout>
(5)部署程序到手机上,如下:
4. 总结:
代码的实现流程分3步:
(1)首先加载ViewPager,新建imageview添加到List<View>中,然后设置adapter并显示。
(2)然后加载LinearLayout(ViewGroup),放置圆点图片,同样新建imageview设置背景后放入到圆点图集合中,这里要使用两张图片,选中和未选中。
(3)最后设置ViewPager的滑动监听事件,在滑动完成的监听OnPageSelected方法中,做两件事,一个判断当前页是哪一页,设置对应的圆点为选中,第二个是如果是最后一页,要显示Button按钮。
同时这里我也推荐4个Android引导页的控件。