App引导界面,可以这么玩
什么是ViewPager,刚一听到这个词,我们可能感觉很奇怪,但是我相信我们大部分人都曾见到过这些界面的。其实它就是我们在安装好一个app之后第一次使用时的那些引导界面的效果。这就是通过ViewPager来完成滴。今天,就让我们一起走进ViewPager的世界吧。
理论基础
其实说是理论基础,也只不过是一些小知识点罢了,所以不要紧张咯。ViewPager在ADT开发时使用到了android.support.v4.view.ViewPager控件,我们需要知道这点就可以了。 我们可以把ViewPager看作是一个ListView样式的控件,然后按照对待ListView的眼光来看待ViewPager,就会很轻松了。 ListView需要一个适配器,而ViewPager同样也是如此;ListView需要注册Item的事件侦听,ViewPager同样如此。至于底层的细节我们稍后再说。
了解了上面的这些,相信我们心中都有了一个大致的了解了吧。那我们就正式开始咯。
ViewPager怎么使用?
首先我们需要在XML文件中进行声明,注意我们引用的是android.support.v4.view.ViewPager控件哦,如下:
然后是在Java代码中findViewById一下,免得出现NullPointerExcetion.
了解到了ViewPager是一个View的容器,那么我们当然要有View才行了,所以我们在layout文件夹下创建几个用于呈现的view。由于比较相似,我这里就仅仅写出一个XML文件吧。
现在万事俱备,只欠东风了。所以我们就需要创建一个适配器了,这里需要注意的是适配器要继承自PagerAdapter
,具体的代码如下:
package com.mark.viewpagerdemo;
import java.util.List;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
/**
* 这个类的作用就是对于ViewPager的Activity(View)的切换的
* 时候需要的一个适配器的作用,其实ViewPager的原理就可以看作是一个ListView就行了
* @author lhdn
*
*/
public class ViewPageAdapter extends PagerAdapter{
//list是为了存储容器中的view,context的作用就是上下文
private List views;
private Context context;
public ViewPageAdapter(List mViews , Context mContext) {
this.context = mContext;
this.views = mViews;
}
/**
* 将不需要呈现的view及时的销毁
*/
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(views.get(position));
}
/**
* 该方法的作用类似于ListViewAdapter的那个getView的作用
*/
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(views.get(position));
return views.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// 判断当前获得的view是不是我们想要得到的view
return (arg0 == arg1);
}
}
其中方法:
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(views.get(position));
return views.get(position);
}
就好比我们的ListViewAdapter的getView方法。功能就是获得一个view,即可。
如果不需要在图片上添加效果的话,这样其实就已经是搞定了,我们可以测试一下效果,发现这个小案例已经是可行的了。
ViewPager添加一些效果
所谓添加效果,就是添加上几个小圆点,比如我们滑动View的时候下面会出现的一些小亮点和小暗点等,其目的是为了显示我们确实滑动了ViewPager,也为了美观嘛。那么我们要怎么实现呢?答案就是使用ImageView就可以了,但是切记只需要在ViewPager所在的界面进行添加就可以了,而不需要为其他的XML文件进行添加。然后我们在ViewPager的OnPageChangeListener处理事件中进行相关的设置就可以了。如下:
package com.mark.viewpagerdemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class Guide extends Activity implements OnPageChangeListener {
private ViewPager vp;
// 因为viewpager的使用要街注意一个适配器,所以要创建一个适配器的对象
private ViewPageAdapter vpAdapter;
// 创建一些视图View,用于放置到我们的ViewPager容器中
private List views;
// 存储图像的小点
private ImageView[] dots;
// 图片小点的ID值
int[] ids = new int[] { R.id.iv1, R.id.iv2, R.id.iv3 };
private Button enter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.guide);
initViews();
initDots();
}
/**
* 初始化ViewPager机器内部的view视图
*/
public void initViews() {
views = new ArrayList();
LayoutInflater inflater = LayoutInflater.from(this);
// 向ViewPager中添加view
views.add(inflater.inflate(R.layout.one, null));
views.add(inflater.inflate(R.layout.two, null));
views.add(inflater.inflate(R.layout.three, null));
// 为进入主界面的按钮申请资源,由于button的值在第三个view中,而这里是Guide的
// 所以,要先得到第三个view之后,才能使用findViewById()方法
enter = (Button) views.get(2).findViewById(R.id.start_btn);
enter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Guide.this, MainActivity.class);
startActivity(intent);
finish();
}
});
// 创建ViewPager以及添加适配器
vp = (ViewPa