当前位置:   article > 正文

viewPager+photoView实现网络图片加载左右滑动+手势缩放功能+滑动到下一页其他页面恢复默认大小_photoview加载网络图片

photoview加载网络图片

前面两篇文章,我们讲了自定义viewpager+photoView实现本地图片的加载和收缩缩放。实现本地相册功能。


如果没有看的话可以先阅读以下,因为今天网络加载图片的功能,实在这个基础上做的修改,会基于之前的基础上讲解。

1.  http://blog.csdn.net/beibaokongming/article/details/51559279

2.  http://blog.csdn.net/beibaokongming/article/details/51583351


但是我们工作中用到的大部分都是加载网络图片,今天我们就来看一下,怎样加载网络图片。

加载网络图片我们用到的是imageLoader开源框架。不需要我们考虑OOM的问题,也不需要考虑异步更新Ui的问题,用着真的非常的爽。


具体怎样使用呢?下面给处具体操作步骤。

1.将imageLoader的jar包,复制到libs文件夹下面。如果没有这个jar包可以在这个地址下载:

http://download.csdn.net/detail/beibaokongming/9543394


2.写一个工具类ImageLoaderUtils,把下边的代码复制到这个类当中,注意把包名换成自己的。

  1. package com.xixiangfu.photoview.util;
  2. import java.io.File;
  3. import android.graphics.Bitmap.Config;
  4. import android.os.Handler;
  5. import android.util.Log;
  6. import android.widget.ImageView;
  7. import com.nostra13.universalimageloader.cache.disc.DiskCache;
  8. import com.nostra13.universalimageloader.core.DisplayImageOptions;
  9. import com.nostra13.universalimageloader.core.DisplayImageOptions.Builder;
  10. import com.nostra13.universalimageloader.core.ImageLoader;
  11. import com.nostra13.universalimageloader.core.assist.ImageScaleType;
  12. import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
  13. import com.xixiangfu.photoview.R;
  14. /**
  15. * imageLoader加载图片的工具类
  16. * 在使用imageLoader之前必须现在applicition类中,设置imageLoader
  17. * @author Administrator
  18. *
  19. * 图片如果需要缓存到硬盘的的话,注意需要添加硬盘读写权限
  20. */
  21. public class ImageLoaderUtils {
  22. static public Builder options_builder = new DisplayImageOptions.Builder()
  23. .resetViewBeforeLoading(true) // 在加载之前设置一个视图
  24. .cacheInMemory(true) // 图片是否缓存到内存
  25. .cacheOnDisk(false) // 图片是否缓存到硬盘
  26. .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) // 设置图片显示样式
  27. .showImageOnLoading(R.drawable.ic_launcher)//在加载图片的过程中,显示的图片
  28. .bitmapConfig(Config.RGB_565) // bitmap的配置
  29. .handler(new Handler()); // 创建一个handler异步显示图片
  30. /**
  31. * 设置全局图片选项设置
  32. * @param aOnloadingImageId
  33. * @param aEmptyUriImageId
  34. * @param aLoadFailImageId
  35. */
  36. static public void setGlobalImageOptions(int aOnloadingImageId,
  37. int aEmptyUriImageId,int aLoadFailImageId){
  38. //例如
  39. // .showImageOnLoading(R.drawable.ic_stub) // resource
  40. // .showImageForEmptyUri(R.drawable.ic_empty) // resource
  41. // .showImageOnFail(R.drawable.ic_error) // resource
  42. options_builder.showImageOnLoading(aOnloadingImageId)//图片加载过程中显示的图片
  43. .showImageForEmptyUri(aEmptyUriImageId)//图片为空的时候显示什么
  44. .showImageOnFail(aLoadFailImageId);//图片加载失败之后显示什么
  45. }
  46. /**
  47. * 根据url加载图片,并且给view展示,并且可以添加监听。
  48. * @param aUrl 图片的额加载地址
  49. * @param aView 要显示图片的view
  50. * @param aListener 加载图片的监听
  51. */
  52. static public void displayImageUrl(String aUrl, ImageView aView,ImageLoadingListener aListener) {
  53. Log.i("TAG", "displayImageUrl aUrl = "+aUrl);
  54. if(aListener==null){
  55. //如果没添加监听的话,调用这个方法
  56. ImageLoader.getInstance().displayImage(aUrl, aView,options_builder.build());
  57. }else{
  58. //添加了监听,调用这个方法
  59. ImageLoader.getInstance().displayImage(aUrl, aView,options_builder.build(),aListener);
  60. }
  61. }
  62. /**
  63. * 根据url确定是否需要缓存
  64. * @param url
  65. * @return
  66. */
  67. static public boolean isImageUrlCached(String url){
  68. if(url==null)
  69. return false;
  70. try {
  71. DiskCache cache = ImageLoader.getInstance().getDiskCache();
  72. if(cache==null)
  73. return false;
  74. File file = cache.get(url);
  75. if(file!=null&&file.exists()){//如果文件存在,并且文件的缓存的目标存在的话,设置缓存文件
  76. return true;
  77. }
  78. } catch (Exception e) {
  79. // TODO Auto-generated catch block
  80. e.printStackTrace();
  81. }
  82. return false;
  83. }
  84. static public void cacheImageUrl(String url,ImageLoadingListener aListener){
  85. ImageLoader.getInstance().loadImage(url, options_builder.build(), aListener);
  86. }
  87. /**
  88. * 检查文件路径是否存在,根据得到的路径,创建一个文件出来
  89. * @param aPath
  90. */
  91. static public void checkPath(String aPath){
  92. new File(aPath).getParentFile().mkdirs();
  93. }
  94. }

3.重写application类,进行imageLoader使用之前的设置。这个是必须的,因为imageLoader在设置之前必须进行设置。

  1. package com.xixiangfu.photoview;
  2. import java.io.File;
  3. import android.app.Application;
  4. import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
  5. import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
  6. import com.nostra13.universalimageloader.core.DisplayImageOptions;
  7. import com.nostra13.universalimageloader.core.ImageLoader;
  8. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
  9. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
  10. import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
  11. import com.nostra13.universalimageloader.utils.StorageUtils;
  12. /**
  13. * 重写application类,在这里定义一些全局变量,或者初始化一些操作
  14. *
  15. * @author Administrator
  16. *
  17. */
  18. public class PhotoViewApplication extends Application {
  19. @Override
  20. public void onCreate() {
  21. super.onCreate();
  22. // 在使用imageLoader之前,必须先设置imageLoader
  23. initImageLoader();
  24. }
  25. /**
  26. * 初始化图片控件加载器配置
  27. */
  28. public void initImageLoader() {
  29. // 创建默认的ImageLoader配置参数
  30. File cacheDir = StorageUtils.getCacheDirectory(this);
  31. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
  32. .threadPoolSize(3)
  33. // default
  34. .threadPriority(Thread.NORM_PRIORITY - 1)
  35. // default
  36. .tasksProcessingOrder(QueueProcessingType.FIFO)
  37. // default
  38. .denyCacheImageMultipleSizesInMemory().memoryCacheSize(8 * 1024 * 1024)
  39. .diskCacheSize(50 * 1024 * 1024).diskCache(new UnlimitedDiscCache(cacheDir)) // default
  40. .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
  41. .imageDownloader(new BaseImageDownloader(this)) // default
  42. .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
  43. .build();
  44. // Initialize ImageLoader with configuration.
  45. ImageLoader.getInstance().init(config);
  46. }
  47. }

4.最后只需要在,我们的显示主页面,提供图片的url地址,然后通过我们自定义的iamgeLoaderUtils 工具类的图片加载方法,加载显示网络图片即可。在之前显示本地资源的基础之上,只需要修改数据源,和调用一下iamgeLoaderUtils工具类的图片下载设置显示方法即可。具体见以下代码,都做了注释,很好理解。


  1. package com.xixiangfu.photoview;
  2. import com.nostra13.universalimageloader.core.assist.FailReason;
  3. import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
  4. import com.xixiangfu.photoview.util.ImageLoaderUtils;
  5. import uk.co.senab.photoview.PhotoViewAttacher;
  6. import android.app.Activity;
  7. import android.graphics.Bitmap;
  8. import android.os.Bundle;
  9. import android.support.v4.view.PagerAdapter;
  10. import android.support.v4.view.ViewPager;
  11. import android.support.v4.view.ViewPager.OnPageChangeListener;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.ViewGroup.LayoutParams;
  15. import android.widget.ImageView.ScaleType;
  16. /**
  17. * 支持手势缩放的图片浏览Demo(滑过的页面会恢复之前默认大小) 实现photoView+ViewPager
  18. *
  19. * @author Administrator
  20. *
  21. */
  22. public class MainActivity extends Activity {
  23. private ViewPager viewPager;// 声明ViewPager
  24. // 创建数据源,这里采用本地数据源
  25. private int[] photoId = { R.drawable.icon_001, R.drawable.icon_002,
  26. R.drawable.icon_003 };
  27. // 创建网络数据源
  28. private String[] urls = {
  29. "http://file.otcgd.com/travel/80/line/da/20110314/2011314_1280358529.jpg",
  30. "http://file25.mafengwo.net/M00/C1/0A/wKgB4lImkp2AbhsjAA3FZePQ0-o73.jpeg",
  31. "http://www.373sqs.com/upfile/images/2009-12/9/200912910821692.jpg",
  32. "http://img101.mypsd.com.cn/20120526/1/Mypsd_176980_201205260857370023B.jpg",
  33. "http://photo.66diqiu.com/uploads/756/ue/image/20141220/1419058611477838.jpg",
  34. "http://pic12.nipic.com/20110221/2707401_092004783000_2.jpg",
  35. "http://pic.nipic.com/2008-05-20/2008520112050960_2.jpg",
  36. "http://pic16.nipic.com/20110913/8361282_172836540179_2.jpg", };
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41. setVies();// 初始化控件
  42. // 给viewPager设置adapter,将每个图片设置到每个页面当中
  43. viewPager.setAdapter(new MyAdapter());
  44. // 给viewPager设置监听
  45. viewPager.setOnPageChangeListener(new OnPageChangeListener() {
  46. @Override
  47. public void onPageSelected(int arg0) {
  48. // viewPager得到页面的数量
  49. int childCount = viewPager.getChildCount();
  50. // 遍历当前所有加载过的PhotoView,恢复所有图片的默认状态
  51. for (int i = 0; i < childCount; i++) {
  52. View childAt = viewPager.getChildAt(i);
  53. try {
  54. if (childAt != null && childAt instanceof PhotoView) {
  55. PhotoView photoView = (PhotoView) childAt;// 得到viewPager里面的页面
  56. PhotoViewAttacher mAttacher = new PhotoViewAttacher(
  57. photoView);// 把得到的photoView放到这个负责变形的类当中
  58. // mAttacher.getDisplayMatrix().reset();//得到这个页面的显示状态,然后重置为默认状态
  59. mAttacher.setScaleType(ScaleType.FIT_XY);// 设置充满全屏
  60. }
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
  66. @Override
  67. public void onPageScrolled(int arg0, float arg1, int arg2) {
  68. // TODO Auto-generated method stub
  69. }
  70. @Override
  71. public void onPageScrollStateChanged(int arg0) {
  72. // TODO Auto-generated method stub
  73. }
  74. });
  75. }
  76. /**
  77. * 初始化控件
  78. */
  79. private void setVies() {
  80. viewPager = (ViewPager) findViewById(R.id.viewPager);
  81. }
  82. /**
  83. * 自定义pagerAdapter
  84. */
  85. public class MyAdapter extends PagerAdapter {
  86. // 得到要显示的图片数量
  87. @Override
  88. public int getCount() {
  89. return urls.length;//得到网络图片url的数量
  90. //return photoId.length;//得到本地资源图片id的数量
  91. }
  92. @Override
  93. public View instantiateItem(ViewGroup container, int position) {
  94. PhotoView photoView = new PhotoView(container.getContext());
  95. // 这里加载的是本地数据源
  96. // photoView.setImageResource(photoId[position]);
  97. // 这里加载的是网络数据源,调用自己写的ImageLoaderUtils工具类中的方法,给上url,给上view,添加监听。就会加载网络图片显示出来了
  98. ImageLoaderUtils.displayImageUrl(urls[position], photoView,
  99. new ImageLoadingListener() {
  100. @Override
  101. public void onLoadingStarted(String imageUri, View view) {
  102. // TODO Auto-generated method stub
  103. }
  104. @Override
  105. public void onLoadingFailed(String imageUri, View view,
  106. FailReason failReason) {
  107. // TODO Auto-generated method stub
  108. }
  109. @Override
  110. public void onLoadingComplete(String imageUri,
  111. View view, Bitmap loadedImage) {
  112. // TODO Auto-generated method stub
  113. }
  114. @Override
  115. public void onLoadingCancelled(String imageUri,
  116. View view) {
  117. // TODO Auto-generated method stub
  118. }
  119. });
  120. // 然后将加载了图片的photoView添加到viewpager中,并且设置宽高
  121. container.addView(photoView, LayoutParams.MATCH_PARENT,
  122. LayoutParams.MATCH_PARENT);
  123. // 设置图片显示为充满全屏
  124. photoView.setScaleType(ScaleType.FIT_XY);
  125. return photoView;
  126. }
  127. @Override
  128. public void destroyItem(ViewGroup container, int position, Object object) {
  129. container.removeView((View) object);
  130. }
  131. @Override
  132. public boolean isViewFromObject(View view, Object object) {
  133. return view == object;
  134. }
  135. }
  136. }


到这里就轻松的实现了,网络图片的加载,并且支持图片的左右滑动和手势缩放。


下篇文章了,我们会介绍如何给网络加载图片时候,添加进度条。提升用户体验。敬请期待!


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/105874?site
推荐阅读
相关标签
  

闽ICP备14008679号