android 加载网络图片 实现图片轮播

来源:互联网 发布:linux网络基础知识 编辑:程序博客网 时间:2024/06/05 20:50
最近实现这样一个功能:
网络图片实现轮播,图片可以手势缩放
这样 用到三个组件:
viewpager 实现图片轮播
photoview 实现图片手势缩放的框架

bitmaputils 高效加载网络图片 防止OOM,属于Xutils。


具体实现
/**
 * ImageView数组
 */
private ImageView[] mImageViews;
/**
 * ViewPager
 */
private ViewPager mViewPager;
/**
 * 存放网络图片url对象集合
 */
private List<TbListBean.ObjBean> tbLists;

具体方法:
mViewPager = (ViewPager) findViewById(R.id.viewPager);
mImageViews new PhotoView[tbLists.size()];
//添加view
 for(int i=0; i<mImageViews.length; i++){

            PhotoView photoView = new PhotoView(mContext);
            photoView.setScaleType(ImageView.ScaleType.FIT_XY);//铺满屏幕

            BitmapUtils bitmapUtilsr = new BitmapUtils(mContext);
//            // 加载网络图片
       bitmapUtilsr.display(photoView, tbLists.get(i).getImgurl());
            bitmapUtilsr.configDefaultShowOriginal(false);//对图片压缩处理
            mImageViews[i] = photoView;

        }
        //设置Adapter
       mViewPager.setAdapter(new MyAdapter());
        //设置监听,主要是设置点点的背景
       mViewPager.setOnPageChangeListener(this);
       //设置ViewPager的默认项,设定进入viewpager展现那个位置的图片
       mViewPager.setCurrentItem(position);//设置ViewPager转到指定的界面

//viewpager adpter
public class MyAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(View container, int position, Object object) {
            ((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);

        }

        /**
         * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
         */
        @Override
       public Object instantiateItem(View container, int position) {
           int  mPosition = position % mImageViews.length;
            ((ViewPager)container).addView(mImageViews[mPosition], 0);
            return mImageViews[mPosition];
\
        }
    }

但是还有一个问题没有解决,那就是当我们将当前页面的图片放大后,当我们滑动到下一页,然后滑回上一页之后,发现上一页的图片还是处于缩放的状态,而不是默认的状态,这不是我们想要的结果。用户体验非常不好。那怎样解决这个问题呢?
其实非常的简单,就是当我们滑动到下一页的时候,给之前的其他页面遍历重新设置一次显示的状态,这样就可以满足我们的需求了。具体的操作步骤如下:
1.给viewPager添加监听
viewPager.setOnPageChangeListener(this);
2.将如下代码放入到重写的viewPager的public void onPageSelected(int arg0) {},这个方法里面。
  1. // 当图片滑动到下一页后,恢复其他所有图片默认大小状态的代码块  
  2.     // viewPager得到页面的数量  
  3.     int childCount = viewPager.getChildCount();  
  4.     // 当图片滑动到下一页后,遍历当前所有加载过的PhotoView,恢复所有图片的默认状态大小  
  5.     for (int i = 0; i < childCount; i++) {  
  6.         View childAt = viewPager.getChildAt(i);  
  7.         try {  
  8.             if (childAt != null && childAt instanceof PhotoView) {  
  9.                 PhotoView photoView = (PhotoView) childAt;// 得到viewPager里面的页面  
  10.                 PhotoViewAttacher mAttacher = new PhotoViewAttacher(  
  11.                         photoView);// 把得到的photoView放到这个负责变形的类当中  
  12.                   
  13.                 //mAttacher.getDisplayMatrix().reset();// 得到这个页面的显示状态,然后重置为默认状态或者做其他的操作  
  14.                                       
  15.                 //这里得到这个页面后,直接重新设置了他的属性,让其拉伸充满全屏,你可以根据自己的需求,设置其他属性  
  16.                 //重新设置属性之后,当从当前放大页面滑动到下一页的时候,前面的放大页面就会重新成为设置的属性大小  
  17.                 mAttacher.setScaleType(ScaleType.FIT_XY);  
  18.                   
  19.             }  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  

  24. 问题得到解决


0 0
原创粉丝点击