我正在尝试在SimpleDraweeView
上实现共享元素转换。
现在一切正常,但是当我从第一个活动导航到下一个活动时,图像会闪烁。
我们知道,为了避免此类现象,我们需要在图片准备就绪时致电postponeEnterTransition()
并致电startPostponedEnterTransition()
。
但是,如果我使用Fresco
,我无法弄清楚我应该在哪里调用它。
我可以使用简单的回调来准备SimpleDraweeView
的图片吗?
感谢@Alexander Oprisnik的回答,我现在已经走得更远了。但是,在设置好所有内容后,我仍然可以在转换过程中看到占位符图像 以下是我的相关代码:
首先,我在Activity onCreate中调用postponeEnterTransition()
。
然后在从Internet加载图像URI之后,调用以下方法:
public static void addSharedElementControllerToDrawee (String uri, Activity activity, SimpleDraweeView view) {
try {
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(ImageRequestBuilder.newBuilderWithSource(Uri.parse(uri)).build())
.setControllerListener(new SharedElementControllerListener(activity))
.build();
view.setController(controller);
} catch (Exception e) {
if (BuildConfig.DEBUG) e.printStackTrace();
view.setImageURI(uri);
}
}
SharedElementControllerListener
的代码是:
public class SharedElementControllerListener extends BaseControllerListener {
private Activity activity;
public SharedElementControllerListener(Activity activity) {
this.activity = activity;
}
@Override
public void onFinalImageSet(String id, @Nullable Object imageInfo, @Nullable Animatable animatable) {
if (Build.VERSION.SDK_INT >= 21 && activity != null) {
activity.startPostponedEnterTransition();
}
activity = null;
}
}
我在postponeEnterTransition()
和startPostponedEnterTransition()
都设置了断点,并观察到它们都被调用了。
因此,在将图像加载到onFinalImageSet()
后,看起来并未真正调用SimpleDraweeView
。
P.S。我还尝试删除占位符,但它只是更改为透明度和图像之间的闪烁。
答案 0 :(得分:0)
您只需创建一个控制器监听器并等待onFinalImageSet(...)
被触发,请参阅http://frescolib.org/docs/listening-to-events.html