简介:

Picasso是Square公司开源的一个Android图形缓存库。可以实现图片下载和缓存功能。

特点:

1.加载载网络或本地图片并自动缓存处理;

2.链式调用;

3.图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;

4.在Adapter中回收和取消当前的下载功能;

与Universal-ImageLoader库对比:

1.都有高效的网络图片下载和缓存性能;
2.Universal-ImageLoader功能多,灵活使用配置;
3.Picasso使用复杂的图片压缩转换来尽可能的减少内存消耗;
4.在Adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题;

用法:

1.图片转换:转换图片以适应布局大小并减少内存占用
Picasso.with(context).load(url).resize(50, 50) .centerCrop() .into(imageView);
2.Adapter 中的下载:Adapter的重用会被自动检测到,Picasso会取消上次的加载;
3.空白或者错误占位图片设置方法及本地资源文件的加载方法;

4.Picasso采用链式调用加载和处理图片方式;

5.除了加载网络图片,picasso还支持加载Resources, assets, files, content providers中的本地资源文件;

下面实现一个ListView显示网络图片:

这里找了四张网络菜谱图片,在代码中新添加一个菜类:

  1. //表示菜类(经过烹调的蔬菜、蛋品、肉类等)
  2. public class Dish {
  3. private String imgUrl; // 图片地址
  4. private String name; // 菜名
  5. private String price; // 菜价
  6. public Dish(String imgUrl, String name, String price) {
  7. this.imgUrl = imgUrl;
  8. this.name = name;
  9. this.price = price;
  10. }
  11. public String getImgUrl() {
  12. return imgUrl;
  13. }
  14. public void setImgUrl(String imgUrl) {
  15. this.imgUrl = imgUrl;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public String getPrice() {
  24. return price;
  25. }
  26. public void setPrice(String price) {
  27. this.price = price;
  28. }
  29. }

主界面类中,调用load方法加载网络图片,调用into方法将图片设置给ImageView之类的组件:

  1. import java.util.ArrayList;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.ImageView;
  9. import android.widget.ListView;
  10. import android.widget.TextView;
  11. import com.squareup.picasso.Picasso;
  12. public class MainActivity extends Activity {
  13. private static final String BASE_URL = "http://img1.3lian.com/img2011/w1/106/85/";
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. ArrayList<Dish> dishList = new ArrayList<Dish>();
  19. dishList.add(new Dish(BASE_URL + "42.jpg", "水煮鱼片", "38.00"));
  20. dishList.add(new Dish(BASE_URL + "34.jpg", "小炒肉", "18.00"));
  21. dishList.add(new Dish(BASE_URL + "37.jpg", "清炒时蔬", "15.00"));
  22. dishList.add(new Dish(BASE_URL + "11.jpg", "金牌烤鸭", "36.00"));
  23. dishList.add(new Dish(BASE_URL + "12.jpg", "粉丝肉煲", "20.00"));
  24. ListView mListView = (ListView) this.findViewById(R.id.listview);
  25. MainListViewAdapter adapter = new MainListViewAdapter(dishList);
  26. mListView.setAdapter(adapter);
  27. }
  28. // ListView适配器
  29. private class MainListViewAdapter extends BaseAdapter {
  30. private ArrayList<Dish> dishList;
  31. public MainListViewAdapter(ArrayList<Dish> list) {
  32. this.dishList = list;
  33. }
  34. @Override
  35. public int getCount() {
  36. return dishList.size();
  37. }
  38. @Override
  39. public Object getItem(int position) {
  40. return dishList.get(position);
  41. }
  42. @Override
  43. public long getItemId(int position) {
  44. return position;
  45. }
  46. @Override
  47. public View getView(int position, View convertView, ViewGroup parent) {
  48. ListViewItemHolder item = null;
  49. if (convertView == null) {
  50. convertView = LayoutInflater.from(MainActivity.this).inflate(
  51. R.layout.main_listview_item, null);
  52. item = new ListViewItemHolder();
  53. item.img_iv = (ImageView) convertView
  54. .findViewById(R.id.imageView1);
  55. item.name_textview = (TextView) convertView
  56. .findViewById(R.id.textView1);
  57. item.price_textview = (TextView) convertView
  58. .findViewById(R.id.textView2);
  59. convertView.setTag(item);
  60. } else {
  61. item = (ListViewItemHolder) convertView.getTag();
  62. }
  63. Dish dish = dishList.get(position);
  64. //这里就是异步加载网络图片的地方
  65. Picasso.with(MainActivity.this).load(dish.getImgUrl())
  66. .into(item.img_iv);
  67. item.name_textview.setText(dish.getName());
  68. item.price_textview.setText(dish.getPrice() + "元");
  69. return convertView;
  70. }
  71. }
  72. // ListView的Item组件类
  73. private class ListViewItemHolder {
  74. ImageView img_iv;
  75. TextView name_textview;
  76. TextView price_textview;
  77. }
  78. }

下面是整个工程的下载链接,有兴趣的可以下载导入到自己的Eclipse中去运行:

Android Picasso

Android之Picasso - bear_huangzhen的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/bear_huangzhen/article/details/45868755

Android之Picasso --zz的更多相关文章

  1. 玩转Android之Picasso使用详详详详详详解,从入门到源码剖析!!!!

    Picasso是Squareup公司出的一款图片加载框架,能够解决我们在Android开发中加载图片时遇到的诸多问题,比如OOM,图片错位等,问题主要集中在加载图片列表时,因为单张图片加载谁都会写.如 ...

  2. Android 使用Picasso加载网络图片等比例缩放

    在做android图片加载的时候,由于手机屏幕受限,很多大图加载过来的时候,我们要求等比例缩放,比如按照固定的宽度,等比例缩放高度,使得图片的尺寸比例得到相应的缩放,但图片没有变形.显然按照andro ...

  3. Java(Android)线程池zz

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  4. Android图片加载与缓存开源框架:Android Glide

    <Android图片加载与缓存开源框架:Android Glide> Android Glide是一个开源的图片加载和缓存处理的第三方框架.和Android的Picasso库类似,个人感觉 ...

  5. Android滑动动画ViewFlipper和视频播放VideoView的使用

    Android滑动动画,可以用ViewPager或者ViewFlipper实现. ViewPager自带触摸滑动功能,结合Fragment使用很好,来自补充组件android-support-v4.j ...

  6. [转载]Android相关开发网站

    my: Android 开发官方文档国内镜像-踏得网: http://wear.techbrood.com/index.html 转载自: http://my.oschina.net/luforn/b ...

  7. Android之Glide(非常好用的图片加载框架)

    谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech. Glide是一种快速.高效的开源媒体管理和Android的包裹mediadecoding图像加载框架,内 ...

  8. Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide

    一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...

  9. Android图片加载库:最全面的Picasso讲解

    前言 上文已经对当今 Android主流的图片加载库 进行了全面介绍 & 对比 如果你还没阅读,我建议你先移步这里阅读 今天我们来学习其中一个Android主流的图片加载库的使用 - Pica ...

随机推荐

  1. phpcms采集地址中为相对路径解决方法

    1.修改数据库v9_collection_node,增加两个字段replace_from,replace_to(varchar(200)) 2./phpcms/modules/collection/t ...

  2. REACT 学习

    1.React/React Native 的ES5 ES6写法对照表 http://bbs.reactnative.cn/topic/15/react-react-native-%E7%9A%84es ...

  3. Python之队列queue模块使用 常见问题与用法

    python 中,队列是线程间最常用的交换数据的形式.queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式 import queue q = queu ...

  4. Appium+Robotframework实现Android应用的自动化测试-2:Windows中启动Appium和模拟器

    一.启动Appium 安装好了之后,在桌面或者菜单中找到Appium,分别双击或点击打开Appium.exe,如果一切正常,接着会出现一个Appium启动后的界面窗口,如下图所示. 1.1 Andro ...

  5. ios nsdataformatter奇怪的问题

    用nsdataformatter在中文格式下测试, a 标识的是上午,下午,不是AM,pm. 我在24小时格式的机器上测试,存入了一个 时间,却解析不出来了! static NSString *Hom ...

  6. Java for LeetCode 223 Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  7. 【关于服务器端SQL Server 2008的设置】 使其他客户端机可通过ODBC数据源可访问

    服务器系统:Server 2003 数据库:SQL Server 2005 服务器配置:开启服务:server.workstation(这两个服务对于提供局域网共享有很大作用) 关闭防火墙 开启gue ...

  8. Effective C++ -----条款10: 令operator=返回一个reference to *this

    比如: Widget& operator=(const Widget& rhs) { ... return* this; } 令赋值(assignment)操作符返回一个referen ...

  9. Match:Period(POJ 1961)

    Period 题目大意:给定一个字符串,要你找到前缀重复了多少次 思路,就是kmp的next数组的简单应用,不要修正next的距离就好了,直接就可以跳转了 PS:喝了点酒用递归实现除法和取余了...结 ...

  10. css实现图片闪光效果

    1.这个效果是看到京东商城上的一个下效果,原本的思路是 用js控制一个图片在某张需要闪光的图片上重复出现,但是 网上找了一些资料,竟然是用css写的,真是太帅了!!! 2.原理:在需要闪光的图片前添加 ...