本文的目标是学会ViewPager的用法,顺便试着实现自动滚动播放的功能。
1 ViewPager的基本使用
ViewPager是android系统提供的一个组件,它是一个可以让用户左右滑动View的容器。下面介绍ViewPager的使用方法。
1.1添加布局
如下代码表示在布局中加入ViewPager组件。
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_height="match_parent"
android:layout_width="match_parent">
</android.support.v4.view.ViewPager>
1.2 初始化View列表
这里只是简单的添加6个ImageView。
private void initView() {
iView0 = new ImageView(getApplicationContext());
iView0.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
iView0.setImageResource(Color.BLACK);
iView1 = new ImageView(getApplicationContext());
iView1.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
iView1.setImageResource(R.drawable.viewpager);
iView2 = new ImageView(getApplicationContext());
iView2.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
iView2.setBackgroundColor(Color.WHITE);
iView3 = new ImageView(getApplicationContext());
iView3.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
iView3.setBackgroundColor(Color.GREEN);
iView4 = new ImageView(getApplicationContext());
iView4.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
iView4.setBackgroundColor(Color.BLUE);
}
1.3初始化Adapter
设置Adapter。
private class MyAdapter extends PagerAdapter {
public MyAdapter() {
Log.d("123", "init adapter");
imList.add(iView0);
imList.add(iView1);
imList.add(iView2);
imList.add(iView3);
imList.add(iView4);
}
@Override
public int getCount() {
// 有多少个View
Log.d("123", imList.size() + "mlist count");
return imList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// 这个就是这么写的,目前不知道为什么
Log.d("123", "isViewFromObject");
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 销毁某个View,ViewPager会保存若干个View,其余的都会销毁。
container.removeView(imList.get(position));
Log.d("123", "destroyItem" + "" + "continer count is" + container.getChildCount());
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 创建一个新的View,并添加到View列表中。
Log.d("123", position + "" + "continer count is" + container.getChildCount());
container.addView(imList.get(position), 0);
return imList.get(position);
}
}
1.4在UI主线程中设置并初始化ViewPager
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
initView();
((ViewPager) findViewById(R.id.viewPager)).setAdapter(new MyAdapter());
}
通过以上步骤完成了对ViewPager的使用。
2.关于自动滚动播放的实现。
目前已经实现了功能,但是还有一点瑕疵,先放出来吧,以后再检查下到底是什么原因。
2.1实现思路
在每次ViewPager翻页之后延时5S发送一个滚动消息,消息包含将要翻页的页数。并且在翻页的时候,清除所有已经存在的延时翻页请求。
要使用到包括Handler类和ViewPager的OnPageChangeListener类。Handler负责子线程与主线程进行通信。OnPageChangeListener类负责更新ViewPager显示的View。
首先,创建Handler类的handleMessage方法对子线程发送的更新UI消息进行处理,当接受到消息之后就对ViewPager进行更新。
其次,在ViewPager的OnPageChangeListener类中PageSelected方法中通过Handler.postDelayed方法,通过延时发送消息的方法实现自动更新显示的View.
2.2实现代码
2.2.1OnCreate方法
在OnCreate方法中增加如下代码:
((ViewPager) findViewById(R.id.viewPager)).addOnPageChangeListener(this);
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// 延时翻页消息的处理
if (msg.what == 1) {
Log.d("123", "handle message nowPage is"+nowPage+"imList count is"+imList.size());
if(msg.arg1==-1){
((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(0);
return true;
}
((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(msg.arg1);
}
return true;
}
});
((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(0);//初始化界面
2.2.2改写OnPageChangeListener中的onPageSelected方法
@Override
public void onPageSelected(int arg0) {
// 翻页之后发送延时翻页消息
handler.removeMessages(1);
Log.d("123", arg0 + "" + "onPageSelected position is" + arg0);
if (arg0 == imList.size() -1) {
nextPage = 0;
}
else{
nextPage=arg0+1;//下一页
}
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg=new Message();
msg.what=1;
msg.arg1=nextPage;
handler.sendMessage(msg);
}
}, 5000);
}
以上便实现了所有的功能,但是在实际的程序中还是有点问题,比如没有处理用户的交互事件,用户长按图片没有处理,留待以后要再看吧。