快速上手Picasso,玩转Android图像加载

1. 写在前面

  1. 本文主要来自Picasso的官方文档的翻译,地址为:http://square.github.io/picasso/,然后自己进行了学习和实践加简单封装(PS:其实这个封装是功能的封装,没有多大的意义,因为人家Picasso已经封装的很好了,行此一举无非是熟悉它的功能罢了!),内容仅供参考,不足之处望请指正。

  2. 此外,个人比较喜欢英语,虽然不是专业的高手、只有六级水平;但是凭借一颗爱好英语的心,应该能翻的八九不离十,因为还是有【实践】撑腰的嘛!再者作为一个程序猿阅读外文的技术文档是少不了的,为此刚开始的翻译应从从简单的技术文档着手,虽然Picasso大家已经非常熟悉了(因为问世挺久的了),但难免有像我一样刚接触不久的,或是将来需要接触的同行们,能为他们提供一点点帮助也是笔者莫大的荣幸。

2.正文: Picasso — 一个强大的Android图片下载和缓存库

1.简介

只需要给您的Android应用程序添加必要的【上下文环境】和【视觉图像】,Picasso就能让你非常轻松的能把图片加载到你的App上———通常一行代码就能搞定!

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

在Android里许多图片加载中遇到的异常都是由Picasso自动处理的,比如:

  • 在你的adapter适配器中自动处理ImageView组件上图片资源的回收和加载。
  • 在尽可能小的内存消耗下使用复杂的图像转换。
  • 自动进行内存和磁盘的缓存。

2.特征功能点

(1)在adapter适配器中的加载图片:

adapter的的复用是由Picasso自动检测的并且会自动取消上一次的加载。(PS:我们一般会使用ListView/GridView/RecycleView等等去显示一些信息,一般是在adapter中会有加载图片的需求,其实核心代码就一行,也是最简单的加载方式,不做任何操作的默认加载。)

    @Override public void getView(int position, View convertView, ViewGroup parent) {
        SquaredImageView view = (SquaredImageView) convertView;
        if (view == null) {
            view = new SquaredImageView(context);
        }
        String url = getItem(position);

        //【核心代码】
        Picasso.with(context).load(url).into(view); 
    }

(2.1)图像变换

变换图像以便更好地适应你的布局和减少内存消耗。(即:指定目标资源宽高来进行图像变换)

Picasso.with(context)
    .load(url)
    .resize(50, 50)
    .centerCrop()
    .into(imageView)    

(2.2)您还可以通过制定自定义的变换或裁剪来达到更完美的适应效果。

(PS:下面的代码功能是裁剪成了正方形)

public class CropSquareTransformation implements Transformation {
    @Override public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;
        Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
        if (result != source) {
             source.recycle();
         }
        return result;
    }

    @Override public String key() { return "square()"; }
}   

(3)占位符(图片)

Picasso同时支持下载未完成和下载错误两种占位符供用户进行选择。(即:无论加载是否成功都有一张备用的图片显示出来,不会太尴尬。)

Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView);

**重点内容**PS:一次图片的加载如果失败的话,会有三次机会重新再尝试,三次都失败的话,占位图片就会被显示出来。

(4)资源的加载

Picasso不仅仅可以加载网上的资源,Resources, assets, files, content providers都可以作为图片的资源,比如:

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

(5)调试指示器

为了开发的方便的话,你可以开始指示器显示一个颜色功能区(在图片的左上角),这个功能区会告诉你图片的来源是【网络(红色】)、【磁盘(蓝色)】亦或是【内存(绿色)】。再创建Piacsso的实例之后,就可以调用setIndicatorsEnabled(true)这个方法来实现这个小功能。

Picasso picasso = Picasso.with(this);
//开启指示器
picasso.setIndicatorsEnabled(true);
Picasso.with(context).load(R.drawable.landing_screen).into(imageView4);

3.下载

最新jar包的下载地址:picasso-2.5.2.jar

Picasso的源代码、它的例子Demo以及这个网站网址都可以在Github上获取到。

Maven

<dependency>
  <groupId>com.squareup.picasso</groupId>
  <artifactId>picasso</artifactId>
  <version>(insert latest version)</version>
</dependency>   

Gradle

compile 'com.squareup.picasso:picasso:(insert latest version)'

3.简单封装

PS:其实这个封装是功能的封装,没有多大的意义,因为人家Picasso已经封装的很好了,行此一举无非是熟悉它的功能罢了!

public class PicassoUtils {

    /**
     * (1)不做任何修改去加载图片
     *
     * @param context   上下文环境
     * @param url   网络图片资源url
     * @param imageView 需要被用来显示的ImageView控件
     */
    public static void defaultLoadedImage(Context context, String url, ImageView imageView) {
    Picasso.with(context)
    .load(url).
    into(imageView);
    }

    /**
     * (2.1)指定目标资源宽高的图像变换
     *
     * @param context   上下文环境
     * @param url   网络图片资源url
     * @param width 目标资源的宽
     * @param height目标资源的高
     * @param imageView 需要被用来显示的ImageView控件
     */
    public static void specifyWidthAndHeightLoadImage(Context context, String url, int width, int height, ImageView imageView) {
            Picasso.with(context)
            .load(url)
            .resize(width, height)
            .centerCrop()
            .into(imageView);
    }

    /**
     * (2.2)通过制定自定义的变换或裁剪
     *
     * @param context   上下文环境
     * @param url   网络图片资源url
     * @param imageView 需要被用来显示的ImageView控件
     */
    public static void diyLoadedImage(Context context, String url, ImageView imageView) {
    Picasso.with(context)
    .load(url)
    .transform(new CropSquareTransformation())
    .into(imageView);
    }


    /**
     * 裁剪成了矩形(这里是正方形)
     */
    public static class CropSquareTransformation implements Transformation {
        @Override
        public Bitmap transform(Bitmap source) {
            int size = Math.min(source.getWidth(), source.getHeight());//尺寸取图片长宽的最小值
            int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;
            //Bitmap source, int x, int y, int width, int height (可以自己调整的宽高)
            Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
            if (result != source) {
                source.recycle();
            }
                return result;
            }

        @Override
            public String key() {
            return "square()";
        }
    }


    /**
     * (3)带有占位图片方式去加载图片
     *
     * @param context  上下文环境
     * @param url  网络图片资源url
     * @param correctImage 加载成功时显示的图片
     * @param errorImage   加载失败时显示的图片
     * @param imageView需要被用来显示的ImageView控件
     */
    public static void loadImageWithPlaceHolder(Context context, String url, int correctImage, int errorImage, ImageView imageView) {
            Picasso.with(context)
            .load(url)
            .placeholder(correctImage)
            .error(errorImage)
            .into(imageView);
    }


    /**
     * (4)是否打开调式指示器
     *
     * @param context 上下文环境
     * @param open 是否打开,true:打开;false:关闭
     */
    public static void isOpenIndicators(Context context, boolean open) {
         Picasso picasso = Picasso.with(context);
         picasso.setIndicatorsEnabled(open);
    }

 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值