Android ViewPager實(shí)現(xiàn)無限循環(huán)的實(shí)例
ViewPager自身并不支持左右無限循環(huán)的功能,這里就提供一種方案讓Android ViewPager實(shí)現(xiàn)左右無限循環(huán)的功能,這里記錄下:
用于顯示的mViews,比數(shù)據(jù)源mList,多了兩個(gè)節(jié)點(diǎn)元素(頭節(jié)點(diǎn)0:b和尾節(jié)點(diǎn)5:e用于跳轉(zhuǎn))
下圖的不帶箭頭的紅線,是mViews根據(jù)mList初始化的情況;帶箭頭的紅線是跳轉(zhuǎn)的情況。

首先還是布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/viewpager" android:background="#33000000" android:orientation="vertical" android:padding="5dip" > <TextView android:id="@+id/tv_image_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="第一個(gè)引導(dǎo)頁面" android:textColor="@android:color/white" android:textSize="14sp" /> <LinearLayout android:id="@+id/ll_points" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:layout_gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </LinearLayout> </RelativeLayout>
接下來是MainActivity:
package com.example.viewpagertest; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; public class MainActivity extends Activity implements OnPageChangeListener { private List<ImageView> imageViewList; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setView(); initView(); } public void setView() { setContentView(R.layout.activity_splash_viewpager); } public void initView() { mViewPager = (ViewPager) findViewById(R.id.viewpager); prepareData(); ViewPagerAdapter adapter = new ViewPagerAdapter(); mViewPager.setAdapter(adapter); mViewPager.setOnPageChangeListener(this); } private void prepareData() { imageViewList = new ArrayList<ImageView>(); int[] imageResIDs = getImageResIDs(); ImageView iv; for (int i = 0; i < imageResIDs.length; i++) { iv = new ImageView(this); iv.setBackgroundResource(imageResIDs[i]); imageViewList.add(iv); } } /** * 在此處本來是5張圖片,現(xiàn)在在數(shù)組首尾各加了一張圖 * @return */ private int[] getImageResIDs() { return new int[]{ R.drawable.pic_02, R.drawable.bg1, R.drawable.bg2, R.drawable.bg3, R.drawable.pic_01, R.drawable.pic_02, R.drawable.bg1, }; } class ViewPagerAdapter extends PagerAdapter { @Override public int getCount() { return imageViewList.size(); } /** * 判斷出去的view是否等于進(jìn)來的view 如果為true直接復(fù)用 */ @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } /** * 銷毀預(yù)加載以外的view對(duì)象, 會(huì)把需要銷毀的對(duì)象的索引位置傳進(jìn)來就是position */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(imageViewList.get(position)); } /** * 創(chuàng)建一個(gè)view */ @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(imageViewList.get(position)); return imageViewList.get(position); } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { if ( imageViewList.size() > 1) { //多于1,才會(huì)循環(huán)跳轉(zhuǎn) if ( position < 1) { //首位之前,跳轉(zhuǎn)到末尾(N) position = 5; mViewPager.setCurrentItem(position,false); } else if ( position > 5) { //末位之后,跳轉(zhuǎn)到首位(1) mViewPager.setCurrentItem(1,false); //false:不顯示跳轉(zhuǎn)過程的動(dòng)畫 position = 1; } } } @Override protected void onDestroy() { super.onDestroy(); } } mViewPager.setCurrentItem(1,false); //false:不顯示跳轉(zhuǎn)過程的動(dòng)畫
上面的代碼只是一個(gè)簡(jiǎn)單的Demo,如果不將跳轉(zhuǎn)動(dòng)畫去掉的話,首尾頁跳轉(zhuǎn)的時(shí)候過渡效果會(huì)很不自然。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注