您的位置:首页 > 其它

ViewPager : Banner滚动

2014-05-30 00:00 836 查看
摘要: ViewPager是android兼容包中的类,本文通过一个例子学习ViewPager

直接上例子,关于VierPager的介绍请看android官方介绍:ViewPager官方文章



如上图,本文实现的就是上面的效果,banner可手动滑动自动滚动,左右无限循环。

废话少说,直接上代码,既然讲ViewPager,肯定是ViewPage实现的。

先上布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v4.view.ViewPager
android:id="@+id/viewPage"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<LinearLayout
android:id="@+id/indicateLayout"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="horizontal" >
</LinearLayout>

</RelativeLayout>


这个我就不解释了,布局文件一眼就能明白。

先实现手动滑动。

这里主要用到:PagerAdapter、OnPageChangeListener。PagerAdapter类似于ListView的适配器,OnPageChangeListener主要是获取ViewPager的滑动回调。

PagerAdapter 官方介绍:

Base class providing the adapter to populate pages inside of a
ViewPager
. You will most likely want to use a more specific implementation of this, such as
FragmentPagerAdapter
or
FragmentStatePagerAdapter
.
When you implement a PagerAdapter, you must override the following methods at minimum:
Object instantiateItem(ViewGroup, int)
void destroyItem(ViewGroup, int, Object)
int getCount()
boolean isViewFromObject(View, Object)


下面对这几个方法一一介绍:

public Object instantiateItem(View container, int position) {
View banner = banners.get(position);
//TODO 可以在此处设置View的一些属性
((ViewPager) container).addView(banner);
return banner;
}


public int getCount() {
//返回ViewPager中显示的view总数
return banners.size();
}


public boolean isViewFromObject (View view, Object object){
//判断是否由instantiateItem初始化返回的对象
return view==object;
}


public void destroyItem(ViewGroup container, int position, Object object) {
//复写的是destroyItem(ViewGroup container, int position, Object object) ,
//不是destroyItem (View container, int position, Object object),这个方法官方不建议复写
container.removeView((View) object);
}


至此,适配器的工作完成。

OnPageChangeListener状态的响应回调,ViewPager切换状态时调用。OnPageChangeListener接口总共三个回调方法:

onPageScrollStateChanged(int state)

onPageScrolled(int position, float positionOffset, int positionOffsetPixels)

onPageSelected(int position)

这里主要是实现onPageSelected,在此方法中设置指示器的状态切换。

public void onPageSelected(int position) {
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
dots.get(position).setBackgroundResource(R.drawable.dot_focused);
ldPosition = position;
}


现在手动滑动功能基本完成。

自动滚动的思路:

自动滚动是通过Handler实现的,当然也可以通过TimeTask或者ScheduledExecutorService等实现。废话少说,上代码:

private void sendScrollMessage(long delayTimeInMills) {
/** remove messages before, keeps one message is running at most **/
mHandler.removeMessages(SCROLL_WHAT);
mHandler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills);
}


class PollingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SCROLL_WHAT:
scroll();
sendScrollMessage(mInterval);
default:
break;
}
}
}


private void scroll() {
PagerAdapter adapter = mViewPager.getAdapter();
int currentItem = mViewPager.getCurrentItem();
int totalCount;
if (adapter == null || (totalCount = adapter.getCount()) <= 1) {
return;
}
if (currentItem == totalCount - 1) {
mViewPager.setCurrentItem(0, mIsBorderAnimation);

} else {
mViewPager.setCurrentItem(++currentItem, true);
}

}


现在开始第三个左右无限循环。

关于无限循环这件事,大概两个思路:

一个是设置适配器的getCount的数量为很大的一个数字然后根据position计算对应的View。

另一个是将getCount的数量设置为view的数量+2.

此处可参考(抱歉真的很懒):

http://blog.csdn.net/garry1024/article/details/11909337

http://blog.csdn.net/Just_Sanpark/article/details/17436037

具体实现我这里就不讲了,直接贴代码:源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ViewPager