ViewPager+ImageView 图片滑动预览

项目需求:

1、展示从网上url获取的图片

2、页面既可以左右滑动,也可以依靠向左向右的箭头按钮控制

难点:

1、如果在ViewpagerAdapter里面使用ImageLoader加载ImageView,因为网络请求耗时较长,会造成每张图片都卡顿

解决方案:

1)先将图片都下载下来

List imageUrls = FragmentSetting.imageUrls;
         len = imageUrls.size();
        List lists = new ArrayList<>();
        ImageViewFactory factory = new ImageViewFactory();
        for (int i = 0;i

其中:

public class ImageViewFactory {
    public ImageView getImageView(Context context,String imgUrl){
        ImageView imageView = (ImageView) LayoutInflater.from(context).inflate(
                R.layout.imageview, null);
        getImageRequest(context,imageView,imgUrl);
        return imageView;
    }

    private void getImageRequest(Context context, final ImageView imageView, String imgUrl) {
        ImageRequest imReq = new ImageRequest(imgUrl, new Response.Listener() {

            @Override
            public void onResponse(Bitmap arg0) {
                imageView.setImageBitmap(arg0);
            }
        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
//                imageView.setImageResource(R.mipmap.default_pic);
            }
        }
        );
        RequestQueue queue = RequestManager.getRequestQueue();
        queue.add(imReq);
        queue.start();
    }
}
重写PagerAdapter

package com.chinaso.so.ui.control;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.android.volley.toolbox.ImageLoader;
import com.chinaso.so.R;

import java.util.List;

/**
 * Created by chinaso on 2015/11/4.
 */
public class ImagePager extends PagerAdapter {
    private Context context;
    private List strDrawables;

    public  ImagePager(Context context, List strDrawables) {
        this.context=context;
        this.strDrawables=strDrawables;
    }

    @Override
    public int getCount() {
        return strDrawables.size();
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        ImageView imageView = strDrawables.get(position);
        container.addView(imageView);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

}



2、currentItem是有两个改变的原因,一个是button的click事件,一个是需要重写Viewpager的setOnPageChangeListener事件

(1)重写ChangeedListener

imgPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if (currentImg == 0) {
                    //如果offsetPixels是0页面也被滑动了,代表在第一页还要往左划
                    if (positionOffsetPixels == 0 && currentPageScrollStatus == 1) {
                        CoverActivity.this.finish();
                    }
                } else if (currentImg == (len - 1)) {
                    //已经在最后一页还想往右划
                    if (positionOffsetPixels == 0 && currentPageScrollStatus == 2) {
                        Toast.makeText(context, "没有下一张啦", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onPageSelected(int position) {
                currentImg = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //记录page滑动状态,如果滑动了state就是1
                currentPageScrollStatus = state;
            }


        });

参数解释:onPageScrollStateChanged(int arg0) ,此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。arg0 ==1表示正在滑动,arg0==2表示滑动完毕了,arg0==0表示什么都没做。当页面开始滑动的时候,三种状态的变化顺序为(1,2,0)。
onPageScrolled(int arg0,float arg1,int arg2) ,当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为:arg0 :当前页面,及你点击滑动的页面。arg1:当前页面偏移的百分比。arg2:当前页面偏移的像素位置。

onPageSelected(int arg0) ,此方法是页面跳转完后得到调用,arg0是你当前选中的页面的position。

(2)重写Click事件

  private class RotateOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            if (view != null){
                int id = view.getId();
                if (id == R.id.point_left){
                    if (currentImg <= 0) {
                        CoverActivity.this.finish();

                    }
                    imgPager.setCurrentItem(--currentImg);
                }else if (id == R.id.point_right){
                    if (currentImg >= (len-1)) {
                        Toast.makeText(context,"没有下一张啦",Toast.LENGTH_SHORT).show();
                    }else{
                    imgPager.setCurrentItem(++currentImg);}
                }
            }
        }
    }


你可能感兴趣的:(ViewPager+ImageView 图片滑动预览)