ViewPager实现循环滑动实现方法+定时自动滑动实现方法详解
要实现如下效果顶部有一行广告条,包含三页每过一段时间自动显示下一个广告页,当前显示最后一页广告的时候下一页是第一页。另外支持用户手段滑动(左右无限滑动,当前是第一页的时候往左滑动,显示最后一下,当前是最后一页的时候往右滑动显示第一页)。点击广告条的时候,打开指定网页。
实现方法的思路:有3个页面(ABC),则我们提供5也页面(XABCY其中X和Y没有任何实际意义) 给Pager的Adapter
Fragment中的关键代码:
private ViewPager mAdPager = null;//定义pager
private int mCurrentAdPageIndex = 1 ;//用于记录当前page的页码
privateImageView[] mAdIndicatorImageViews = null ;//用于标记当前是在哪个页面的图标,这里用五角星,高亮表示选中
private Handler mUiHandler = null ; //用于实现timer
privateAdItemClickListener mAdItemClickListener = null ;//点击事件监听器
private voidinitAdPager() {
ViewGroup group =(ViewGroup) getActivity()
.findViewById(R.id.viewGroup) ;
mAdItemClickListener = newAdItemClickListener() ;
//存放的是三张广告背景img1 img2 img3
List<View> advPics = newArrayList<View>() ;
ImageView img1 = newImageView(getActivity()) ;
img1.setBackgroundResource(R.drawable.ad_1) ;
img1.setOnClickListener(mAdItemClickListener) ;
img1.setTag("http://www.baidu.com") ;
ImageView img2 = newImageView(getActivity()) ;
img2.setBackgroundResource(R.drawable.ad_2) ;
img2.setOnClickListener(mAdItemClickListener) ;
img2.setTag("http://www.163.com") ;
ImageView img3 = newImageView(getActivity()) ;
img3.setBackgroundResource(R.drawable.ad_3) ;
img3.setOnClickListener(mAdItemClickListener) ;
img3.setTag("http://www.qq.com") ;
// img1 img2 img3 循环滑动
// img0 img1img2 img3 img4
ImageView img0 = newImageView(getActivity()) ;
ImageView img4 = newImageView(getActivity()) ;
advPics.add(img0) ;
advPics.add(img1) ;
advPics.add(img2) ;
advPics.add(img3) ;
advPics.add(img4) ;
// 对imageviews进行填充
mAdIndicatorImageViews = newImageView[advPics.size() - 2] ;
// 小图标
for (int i = 0; i < advPics.size() -2; i++) {
ImageView imageView = newImageView(getActivity()) ;
LinearLayout.LayoutParams lp = newLinearLayout.LayoutParams(20,20);
lp.setMargins(0,0, 20, 0);//modify 20 to a suitable value
imageView.setLayoutParams(lp) ;
mAdIndicatorImageViews[i] = imageView ;
if (i == 0) {
mAdIndicatorImageViews[i]
.setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;
} else {
mAdIndicatorImageViews[i]
.setBackgroundResource(R.drawable.music_handle_favorites_normal_icon) ;
}
group.addView(mAdIndicatorImageViews[i]) ;
}
mAdPager =(ViewPager) getActivity().findViewById(R.id.adv_pager) ;
mAdPager.setOffscreenPageLimit(5);
mAdPager.setAdapter(newAdvAdapter(advPics)) ;
mAdPager.setOnPageChangeListener(newAdPageChangeListener()) ;
mAdPager.setOnTouchListener(newOnTouchListener() {
@Override
public booleanonTouch(View v, MotionEvent event) {
switch (event.getAction()){
caseMotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//Log.d(TAG,"onTouch down or move") ;
pauseShowNextAdPageDelay() ;
break ;
caseMotionEvent.ACTION_UP:
showNextAdPageDelay() ;
//Log.d(TAG,"onTouch up") ;
break ;
default:
break ;
}
return false ;
}
}) ;
mAdPager.setCurrentItem(mCurrentAdPageIndex, false) ;
showNextAdPageDelay() ;
}
private Runnable mShowAdNextRunnable = newRunnable() {
@Override
public void run() {
int index = ++mCurrentAdPageIndex % (mAdIndicatorImageViews.length + 1) ;
if(index == 0) {
mCurrentAdPageIndex = 1;
index = 1;
}
mAdPager.setCurrentItem(index, false) ;
showNextAdPageDelay() ;
}
} ;
private voidshowNextAdPageDelay() {
mUiHandler.postDelayed(mShowAdNextRunnable, 4500) ;
}
private voidpauseShowNextAdPageDelay() {
mUiHandler.removeCallbacks(mShowAdNextRunnable) ;
}
private classAdItemClickListener implements OnClickListener {
@Override
public voidonClick(View v) {
Object tag = v.getTag();
Log.d(TAG, "onClick()") ;
if (!(tag instanceof String)){
Log.d(TAG, "tagis not a string") ;
return ;
}
String url =(String) tag ;
if ("".equals(url)) {
Log.d(TAG, "urlis empty") ;
return ;
}
openBrowserWithUrl(url) ;
}
}
private voidopenBrowserWithUrl(String url) {
Intent intent = newIntent(Intent.ACTION_VIEW) ;
intent.setData(Uri.parse(url)) ;
startActivity(intent) ;
}
private final classAdPageChangeListener implements OnPageChangeListener{
boolean mIsAutoScrolled = false ;
@Override
public voidonPageScrollStateChanged(int arg0) {
Log.d(TAG, "onPageScrollStateChangedarg0 = " + arg0 + ", currentIdex = " + mAdPager.getCurrentItem());
switch (arg0) {
caseViewPager.SCROLL_STATE_DRAGGING:// 手势滑动
mIsAutoScrolled = false ;
break ;
caseViewPager.SCROLL_STATE_SETTLING:// 界面切换
mIsAutoScrolled = true ;
break ;
caseViewPager.SCROLL_STATE_IDLE:
if (mAdPager.getCurrentItem()== mAdPager.getAdapter()
.getCount() - 2&& !mIsAutoScrolled) {
mAdPager.setCurrentItem(1);
return ;
}
if (mAdPager.getCurrentItem()== 1 && !mIsAutoScrolled) {
mAdPager.setCurrentItem(mAdPager.getAdapter()
.getCount() -2) ;
return ;
}
break ;
default:
break ;
}
}
@Override
public voidonPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public voidonPageSelected(int arg0) {
Log.d(TAG, "onPageSelected: " + arg0);
for (int i = 0; i < mAdIndicatorImageViews.length; i++) {
mAdIndicatorImageViews[i]
.setBackgroundResource(R.drawable.music_handle_favorites_normal_icon) ;
}
if(arg0 > mAdIndicatorImageViews.length) {
Log.d(TAG, "setCurrentItem" + 1);
mAdPager.setCurrentItem(1,false) ;
mAdIndicatorImageViews[1 - 1]
.setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;
}else if(arg0 < 1) {
Log.d(TAG, "setCurrentItem" + mAdIndicatorImageViews.length);
mAdPager.setCurrentItem(mAdIndicatorImageViews.length, false) ;
mAdIndicatorImageViews[mAdIndicatorImageViews.length - 1]
.setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;
}else {
Log.d(TAG, "setCurrentItem" + arg0);
//mAdPager.setCurrentItem(arg0,false) ;
mAdIndicatorImageViews[arg0 - 1]
.setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;
}
}
}
private final classAdvAdapter extends PagerAdapter {
privateList<View> views = null ;
publicAdvAdapter(List<View> views) {
this.views = views ;
}
@Override
public voiddestroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(views.get(arg1)) ;
}
@Override
public voidfinishUpdate(View arg0) {
}
@Override
public intgetCount() {
return views.size() ;
}
@Override
public ObjectinstantiateItem(View arg0, int arg1) {
Log.d(TAG, "instantiateItem:" + arg1);
//((ViewPager)arg0).removeView(views.get(arg1)) ;
((ViewPager) arg0).addView(views.get(arg1), 0) ;
return views.get(arg1) ;
}
@Override
public booleanisViewFromObject(View arg0, Object arg1) {
return arg0 == arg1 ;
}
@Override
public voidrestoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
publicParcelable saveState() {
return null ;
}
@Override
public voidstartUpdate(View arg0) {
}
}
Xml file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/adv_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="@drawable/ad_migu1">
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="10dp"
android:layout_marginTop="-10dp"
android:gravity="center"
android:orientation="horizontal">
</LinearLayout>
<GridView
android:id="@id/chart_grid"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:layout_weight="7"
android:numColumns="2"/>
<TextView
android:id="@id/empty_view"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/text_empty_view"
android:textColor="@color/list_view_empty_view_text_color"/>
</LinearLayout>