在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()方法里面去回收没有用到的图片或布局,从而保证内存不溢出;