当我们第一次下载qq并且打开的时候,会有一个新手引导,引导是几张图片,再加上一些文字说明,向右滑动,直到结束,今天一大早起来研究了一下关于此种效果的实现之viewpager控件。
下面这个例子将用viewpager实现横向移动相册,viewpager有一个对应的pageradapter,用于绑定数据;我们需要继承此类并实现自己的功能。
1、首先定义一个显示项所需要使用的数据对象imageitem
public class imageitem {
private int id;// 资源id
private string name;// 显示的名称
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public imageitem(int id, string name) {
super();
this.id = id;
this.name = name;
}
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
}
2、viewpager中每一面为一个item,所以在layout目录下定义一个viewpager的每一页的item,名为pageritem.xml
<framelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<imageview
android:id="@+id/imgview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:contentdescription="@string/app_name"
android:scaletype="fitxy" />
<textview
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal" />
</framelayout>
3、新建一个java文件,对应viewpager的每一项item
public class viewpageritem extends framelayout {
private imageview imageview;// 显示图片的imageview
private textview textview;
private bitmap bitmap;// 图片对应的bitmap
private imageitem imageitem;// 每一个图片项对象
public viewpageritem(context context) {
super(context);
setviews();
}
public viewpageritem(context context, attributeset attrs) {
super(context, attrs);
setviews();
}
public void setdata(imageitem item) {// 用imageitem填充数据
this.imageitem = item;
int resid = item.getid();
string name = item.getname();
imageview.setimageresource(resid);
textview.settext(name);
}
public void reload() {// 重新载入数据
int resid = imageitem.getid();
imageview.setimageresource(resid);
}
public void recycle() {// 回收数据
imageview.setimagebitmap(null);
if (this.bitmap == null || this.bitmap.isrecycled()) {
return;
}
this.bitmap.recycle();
this.bitmap = null;
}
public void setviews() {
layoutinflater infalter = layoutinflater.from(getcontext());
view view = infalter.inflate(r.layout.pageritem, null);
textview = (textview) view.findviewbyid(r.id.textview);
imageview = (imageview) view.findviewbyid(r.id.imgview);
addview(view);
}
}
4、新建一个数据填充器pageritemadapter,继承自pageradapter
public class pageritemadapter extends pageradapter {
private context context;
private imageitem[] image;
public pageritemadapter(context context, imageitem[] image) {
this.context = context;
this.image = image;
hashmap = new hashmap<integer, viewpageritem>();
}
private hashmap<integer, viewpageritem> hashmap;// 保存相片的id以及对应的viewpageritem
@override
public int getcount() {
return image.length;
}
@override
public boolean isviewfromobject(view arg0, object arg1) {
return arg0 == arg1;
}
@override
public void finishupdate(viewgroup container) {
super.finishupdate(container);
}
@override// 初始化一个viewpageritem,如果已经存在就重新载入,没有的话new一个
public object instantiateitem(viewgroup container, int position) {
viewpageritem item;
if (hashmap.containskey(position)) {
item = hashmap.get(position);
item.reload();
} else {
item = new viewpageritem(context);
imageitem itemimg = image[position];
item.setdata(itemimg);
hashmap.put(position, item);
((viewpager) container).addview(item);
}
return item;
}
@override// 当我们左右滑动图片的时候会将图片回收掉
public void destroyitem(view container, int position, object object) {
viewpageritem item = (viewpageritem) object;
item.recycle();
}
}
5、在main.xml文件中添加一个viewpager控件
<android.support.v4.view.viewpager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
6、修改mainactivity如下:
public class mainactivity extends activity {
private final static int res[] = { r.drawable.p1, r.drawable.p2 };// p1,p2为drawable文件夹下的两张图片
private viewpager viewpager;
private pageritemadapter adapter;
private imageitem[] item;
private void setview(){
item = new imageitem[2];
item[0] = new imageitem(res[0], "page1");
item[1] = new imageitem(res[1], "page2");
viewpager = (viewpager) findviewbyid(r.id.viewpager);
adapter = new pageritemadapter(getapplicationcontext(), item);
viewpager.setadapter(adapter);
}
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
setview();
}
}
运行程序,左右滑动屏幕出现如下效果!