Picasso框架的基本使用

来源:互联网 发布:淘宝企业店铺开店装修 编辑:程序博客网 时间:2024/06/05 17:25
Picasso框架下载地址:https://github.com/square/picasso 
    
首先在Android studio中导入依赖
  1. compile 'com.squareup.picasso:picasso:2.5.2'

1、图片加载
1.1 加载本地图片
  1. int resourceId = R.mipmap.ic_launcher;
  2. Picasso.with(this).load(resourceId).into(iv1);
1.2 加载sd卡图片
  1. File file = new File(path);
  2. Picasso.with(this).load(file).into(iv2);
1.3 加载网络图片
  1. String uri = "http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg";
  2. Picasso.with(this).load(uri).into(iv3);
1.4 加载网络图片(初始图片和错误图片)
  1. String path = "http://img.my.csdn.net/uploads/201407/26/1406382765_7341.jpg";
  2. Picasso.with(this)
  3. .load(path)
  4. .placeholder(R.mipmap.ic_launcher) //默认显示图片
  5. .error(R.mipmap.ic_launcher) //加载时出现错误显示的图片
  6. .into(iv5);

2、加载图片不缓存
  1. Picasso.with(this) //查看大图放弃缓存,加速内存的回收
  2. .load(Images.imageThumbUrls[3])
  3. .memoryPolicy(NO_CACHE, NO_STORE)
  4. .into(iv6);

3、图片填充方式
3.1  该属性会根据Image View的大小充满整个View,不考虑比例,可能造成图片的拉伸或者缩小
Picasso会对图片的大小及imageview进行测量,计算出最佳的大小及最佳的图片质量来进行图片展示,减少内存,并对视图没有影响。
  1. Picasso.with(this).load(imageUrl).fit().into(imageView);
3.2 按比例裁减图片,使其居中显示,充满View,会造成图片显示不全,必须与resize方法同时使用
  1. Picasso.with(this).load(imageUrl).resize(320, 640).centerCrop().into(imageView);
3.3 按比例裁减图片,图片可以完全显示,但如果图片比View小,则无法充满整个View,必须与resize方法同时使用
  1. Picasso.with(this).load(imageUrl).resize(320, 640).centerInside().into(imageView);
3.4 这里面使用的测试图片的大小是1240*1563,如果resize的宽高大于图片的原始宽高,则resize不起作用,采用图片原始宽高显示。
  1. Picasso.with(this).load(imageUrl).resize(1240, 1563).onlyScaleDown().into(imageView);


4、重写ImageView的onDetachedFromWindow方法,在它从屏幕中消失时回调,去掉drawable引用,能加快内存的回收。
如果一个屏幕上顶部图片较大,而底部图片较小,因为Picasso是异步加载,所以小图会先加载出来,但是对于用户来说,更希望看到的是上面的图片先加载,

底部的图片后加载,Picasso支持设置优先级,分为HIGH, MEDIUM, 和 LOW,所有的加载默认优先级为MEDIUM。

  1. Picasso.with(this)
  2. .load("http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg")
  3. .priority(HIGH) //priority()设置图片加载的优先级
  4. .into(recyclerImageView);

5、取消图片的过渡显示效果noFade()
  1. Picasso.with(this).load(imageUrl).noFade().into(imageView);
默认情况下图片显示出来都会有一个过渡的效果,添加.noFade方法后,可以使该取消该效果,基本上很少使用

6、图片旋转rotate()
  1. //以(0,0)为中心顺时针旋转45度
  2. Picasso.with(this).load(imageUrl).rotate(45).into(imageView);
  3. //以(64,64)为中心顺时针旋转45度
  4. Picasso.with(this).load(imageUrl).rotate(45, 64, 64).into(imageView);

7、缓存策略

Picasso提供缓存的调试方法,通过如下代码可设置

  1. Picasso.with(this).setIndicatorsEnabled(true);

8、tag标签管理

使用过list加载图片的童鞋都知道在列表滚动过程中停止加载图片,停止滚动时恢复图片加载,那么这样的功能在Picasso中时如何实现的呢? 
这就用到了tag标签的功能 
通过如下代码设置tag:

  1. Picasso.with(this).load(imageUrl).tag("landptf").into(imageView);

在Picasso类中提供了如下几个方法来控制tag

  1. cancelTag(Object tag)
  2. pauseTag(Object tag)
  3. resumeTag(Object tag)

通过名字可以很好理解了,我们在列表滚动的时候调用

  1. Picasso.with(this).pauseTag("landptf");
在停止滚动的时候调用
  1. Picasso.with(this).resumeTag("landptf");

至于cancelTag用于取消下载,一般我们在Activity销毁的时候将未完成的请求取消。

  1. Picasso.with(this).cancelTag("landptf");

9、列表加载显示
  1. public class ListViewPicassoActivity extends Activity{
  2. RecyclerView recyclerView;
  3. private List<String> mDatas;
  4. private Adapter adapter;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.listview);
  9. initData();
  10. initView();
  11. }
  12. private void initView(){
  13. recyclerView = (RecyclerView) findViewById(R.id.recycler);
  14. LinearLayoutManager manager=new LinearLayoutManager(this); // 设置布局管理LayoutManager
  15. // manager.setOrientation(LinearLayoutManager.HORIZONTAL); //设置水平或者垂直
  16. recyclerView.setLayoutManager(manager);
  17. recyclerView.setHasFixedSize(true);// (可选)如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
  18.  
  19. adapter=new Adapter(mDatas,this);
  20. recyclerView.setAdapter(adapter); // 设置Adapter
  21. //RecyclerView滑动时监听
  22. recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
  23. //如果tag状态为pause或者resume的话,Picasso会对tag持有一个引用,如果此时用户退出了当前Activity,
  24. //垃圾回收机制进行回收的时候,就会出现内存泄露,所以需要在onDestory()方法中进行相应处理;
  25. @Override
  26. public void onScrollStateChanged(RecyclerView recyclerView, int newState)
  27. {
  28. final Picasso picasso = Picasso.with(ListViewPicassoActivity.this);
  29. if (newState == RecyclerView.SCROLL_STATE_IDLE) {
  30. picasso.resumeTag("RecyclerView"); //可见标记
  31. } else {
  32. picasso.pauseTag("RecyclerView"); //暂停标记 取消标记 cancleTag()
  33. }
  34. }
  35. });
  36. }
  37. private void initData() {
  38. mDatas = new ArrayList<String>();
  39. for (int i = 0; i <= 19; i++) {
  40. mDatas.add("item---" +i);
  41. }
  42. }
  43. }
  1. public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{
  2. public List<String> datas = null;
  3. private Context context;
  4. public Adapter(List<String> datas, Context context) {
  5. this.datas = datas;
  6. this.context=context;
  7. }
  8. //创建新View,被LayoutManager所调用
  9. @Override
  10. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  11. View view = LayoutInflater.from(context).inflate(R.layout.lv_item,viewGroup,false);
  12. return new ViewHolder(view);;
  13. }
  14. //将数据与界面进行绑定的操作
  15. @Override
  16. public void onBindViewHolder(ViewHolder viewHolder, int position) {
  17. viewHolder.mTextView.setText(datas.get(position));
  18. Picasso.with(context)
  19. .load(Images.imageThumbUrls[position])
  20. .tag("RecyclerView") //参数为 Object
  21. .into(viewHolder.imageView);
  22. }
  23. //获取数据的数量
  24. @Override
  25. public int getItemCount() {
  26. return datas.size();
  27. }
  28. //自定义的ViewHolder,持有每个Item的的所有界面元素
  29. public class ViewHolder extends RecyclerView.ViewHolder{
  30. public TextView mTextView;
  31. public ImageView imageView;
  32. public ViewHolder(View view){
  33. super(view);
  34. mTextView=(TextView)view.findViewById(R.id.textview);
  35. imageView= (ImageView) view.findViewById(R.id.imageViewitem);
  36. }
  37. }
  38. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <android.support.v7.widget.RecyclerView
  6. android:id="@+id/recycler"
  7. android:scrollbars="none"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:fadingEdge="none"
  11. />
  12. </LinearLayout>
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="match_parent"
  5. android:layout_height="115dp"
  6. android:background="#0099ff"
  7. android:gravity="center_vertical"
  8. >
  9. <TextView
  10. android:id="@+id/textview"
  11. android:layout_width="match_parent"
  12. android:layout_height="35dp"
  13. android:gravity="center"
  14. android:textSize="19sp"
  15. android:textColor="#000000"
  16. android:text="我是条目"
  17. android:layout_marginTop="5dp"/>
  18. <ImageView
  19. android:id="@+id/imageViewitem"
  20. android:layout_width="match_parent"
  21. android:layout_height="match_parent"
  22. android:layout_marginBottom="5dp"/>
  23. <View
  24. android:layout_width="match_parent"
  25. android:layout_height="3dp"
  26. android:background="#FF0000"
  27. />
  28. </LinearLayout>


Picasso框架就介绍到这了,具体如何使用,请参考以下资料:
picasso使用简要说明   http://blog.csdn.net/chenguang79/article/details/50621748