在app首頁中我們經常會看到滑動的歡迎界面,和介紹頁面,在一個activity或是fragment中實現多圖片或多見面,下面我們介紹下fragment和viewpager的實現
看源碼
<span style="font-size:14px;">public class CreateCardNewFragment extends BaseFragment {
private List<View> mPagers = new ArrayList<>();
private ViewPager mViewPager;
private SplashViewAdapter adapter;
private int[] mViewPagerImages = new int[]{
R.drawable.bg_create_card_one_show,
R.drawable.icon_create_card_two, R.drawable.icon_create_card_three,
R.drawable.icon_create_card_four, R.drawable.bg_create_card_five,
R.drawable.bg_create_card_six, R.drawable.icon_create_card_seven
};
protected View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = View.inflate(getActivity(), R.layout.view_splash_view_pager, null);
mViewPager = (ViewPager) view.findViewById(R.id.fl_welcome_view);
mViewPager.setOnPageChangeListener(mPageListener);
setPagers();
adapter = new SplashViewAdapter(mPagers);
mViewPager.setAdapter(adapter);
}
private void setPagers() {
viewTwo = getImageView();
viewThree = getImageView();
viewFour = getImageView();
mPagers.add(viewTwo);
mPagers.add(viewThree);
mPagers.add(viewFour);
}
private ImageView getImageView() {
ImageView mImageView = new ImageView(getActivity());
return mImageView;
}
private ViewPager.SimpleOnPageChangeListener mPageListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
mPosition = position;
//滑動屏幕
}
};
/**
* 適配器
*/
public class SplashViewAdapter extends PagerAdapter {
private List<View> list;
SplashViewAdapter(List<View> list) {
this.list = list;
}
public void setViewList(List<View> viewList) {
this.list = viewList;
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
private Bitmap getBitMap(int position) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inInputShareable = true;
//options.inSampleSize = 2;
options.inPurgeable = true;
InputStream in;
in = getResources().openRawResource(mViewPagerImages[position]);
bitmap = BitmapFactory.decodeStream(in, null, options);
return bitmap;
in = getResources().openRawResource(mViewPagerImages[position + 1]);
Bitmap mBitmap = BitmapFactory.decodeStream(in, null, options);
return mBitmap;
}
}
//創建顯示界面
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = list.get(position);
view.setBackgroundDrawable(new BitmapDrawable(getBitMap(position)));
container.addView(view);
return view;
}
//回收界面
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
if (isFirstView) {
isFirstView = false;
} else {
if (object instanceof ImageView) {
ImageView imageView = (ImageView) object;
WeakReference<Bitmap> weakReference = new WeakReference<>
(((BitmapDrawable) imageView.getBackground()).getBitmap());
if (weakReference != null && weakReference.get() != null && !weakReference.get().isRecycled()) {
weakReference.get().recycle();
}
}
}
}
}
}</span>
ViewPager 的layout<span style="font-size:14px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<android.support.v4.view.ViewPager
android:id="@+id/fl_welcome_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</RelativeLayout></span>
總結:在我們應用viewpager時內存溢出無疑是大家頭疼的事情,一旦超過了5張左右的大圖,那麼就很容易出現溢出,所有上面我在代碼中把界面的創建放在了instantiateItem()方法當中,每次需要的時候纔去加載創建對應的界面,這樣避免了一次性加載全部的圖片導致溢出,在destroyItem()方法裏面去回收沒有用到的圖片或佈局,從而保證內存不溢出;