我正在尝试使用Picasso从URL加载图像到ImageView
。
共享动画的图像位于RecyclerView
中的CardView
中,第二个图像位于LinearLayout中。
第一次请求时,由于Picasso需要将图像加载到视图中,因此元素不会执行动画,但在后续请求中就可以了。
如何确保在启动过渡之前ImageView
已成功填充?
我正在尝试使用Picasso从URL加载图像到ImageView
。
共享动画的图像位于RecyclerView
中的CardView
中,第二个图像位于LinearLayout中。
第一次请求时,由于Picasso需要将图像加载到视图中,因此元素不会执行动画,但在后续请求中就可以了。
如何确保在启动过渡之前ImageView
已成功填充?
postponeEnterTransition()
和startPostponedEnterTransition()
调用来确保 Picasso 在活动开始之前将图像加载到视图中。
这篇文章对此进行了很好的阐述。
下面是一个在onCreate
中可能使用的示例:
ActivityCompat.postponeEnterTransition(this);
Picasso.with(this.getApplicationContext())
.load("https://goo.gl/oiyTor")
.noFade()
.fit()
.centerInside()
.error(R.drawable.user_placeholder_error)
.into(((ImageView) findViewById(R.id.game_view_image)), new Callback() {
@Override
public void onSuccess() {
ActivityCompat.startPostponedEnterTransition(targetActivity);
}
@Override
public void onError() {
ActivityCompat.startPostponedEnterTransition(targetActivity);
}
});
如果您想避免由于推迟进入转换而引起的影响,您可以强制Picasso使用其已经缓存的内容:
Target target = new Target() {
@Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
this.imageView.setImageBitmap(bitmap);
}
@Override public void onBitmapFailed(Drawable errorDrawable) {}
@Override public void onPrepareLoad(Drawable placeHolderDrawable) {}
};
Picasso.with(context)
.load(url)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(target);
你可以用Universal Image Loader替换Picasso,它能很好地解决这个问题。
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(drawable)
.showImageForEmptyUri(emptyDrawable)
.showImageOnFail(errorDrawable)
.resetViewBeforeLoading(false)
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.build();
imageLoader.displayImage(url, iv, options);