Picasso入门教程(五) Placeholder,errors,Fading

Placeholder:.placeholder()

我们可能不需要解释这种现象:一个空的ImageView在你的UI中肯定不好看。如果你使用Picasso,你可能通过网络连接来加载图片,这取决于用户的环境,这可能会花费很长时间。一个比较好的解决方案是在加载图片的过程中,你可以先加载一个本地图片当做替代图片,直到从网络下载的图片加载出来。
Picasso的流接口使得这样实现变得非常简单!只需要调用.placeHolder() 这个方法,在加载出网络图片之前,Picasso将会展示placeholder的图片。

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .into(imageViewPlaceholder);

很明显,你不可以将一张网络上的图片用作替代图片,因为这依旧需要从网上加载。app上的资源和图片是即时可用的。然而,对于load()这个参数,Picasso可以接受所有类型的值。这个可能不会被加载出来(无网络连接,服务器崩溃),在下一节,我们会讨论error placeholder。

Error Placeholder:.error()

我们假定app需要从网络上加载图片,但是当前网络出问题了。Picasso会将错误返回并且做出合适的处理。在我们做出相应的操作之前,我们可以先使用一张替代图片来代替来告诉用户图片加载出错了。这和之前Picasso处理placeholder的流接口是相同的,只是使用一个名为error()的函数。

Picasso
    .with(context)
    .load("http://futurestud.io/non_existing_image.png")
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
    .into(imageViewError);
    ```
就是这个了!如果你想要加载的图片并没有加载,Picasso将会加载`R.mipmap.future_studio_launcher` 。同样,error()所传的参数只能是被初始化过得drawable对象或者它们的id。

#noFade()的使用
无论在加载图片之前你有没有设置placeholder,Picasso总是自动渐显(fade in)加载图片,因为这会让你的ui变化不那么突兀。如果你希望直接加载图片,而没有渐显(fade)的效果,使用`.noFade()`这个方法即可。
这会直接加载图片,而不带任何效果。在你这样做之前,请先确定你是真的需要这个效果。
知道所有的参数都是独立的并且不依赖于其他参数这很重要。例如,你可以设置`.error()` 而不需要调用`.placeholder()`. 任何参数进行组合都是有可能的。

#noPlaceholder的使用
你可能会发现我们曾经使用过noPlaceholder()。很重要的一点是:这并不是取消之前设置的`.placeholder()` 或者`.error()` 。这适用于另一种不同的情况。
我们来想一下下面这种情况:你在ImageView中加载了一张图片,一段时间过后,你想在同样的ImageView中加载另一张图片。使用默认的设置,你在重新调用Picasso的时候,ImageView将会加载之前设置的placeholder的图片。如果这个ImageView在你的UI中很重要的话,在几秒钟内快速的改变ImageView的图片会看起来很不合适。一个比较好的解决方案是调用`.noPlaceholder()`这个方法。在第二张图片加载之前,ImageView会一直显示第一张图片。这对用户来说会很友好。

// load an image into the imageview
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into(imageViewNoPlaceholder, new Callback() {
@Override
public void onSuccess() {
// once the image is loaded, load the next image
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[1])
.noPlaceholder() // but don’t clear the imageview or set a placeholder; just leave the previous image in until the new one is ready
.into(imageViewNoPlaceholder);
}

    @Override
    public void onError() {

    }
});

“`
这一段代码就做了我们描述的那一种情况。当加载完第一张图片的时候,开始发送第二个请求。然而,幸运的是,我们使用了.noplaceholder(),这就会在加载第二张图片之前,ImageView一直显示第一张图片。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值