如果我使用Fresco,如何开始推迟共享元素转换?

时间:2018-01-08 06:19:23

标签: android fresco shared-element-transition

我正在尝试在SimpleDraweeView上实现共享元素转换。

现在一切正常,但是当我从第一个活动导航到下一个活动时,图像会闪烁。

我们知道,为了避免此类现象,我们需要在图片准备就绪时致电postponeEnterTransition()并致电startPostponedEnterTransition()

但是,如果我使用Fresco,我无法弄清楚我应该在哪里调用它。

我可以使用简单的回调来准备SimpleDraweeView的图片吗?

编辑于2018-01-29

感谢@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。我还尝试删除占位符,但它只是更改为透明度和图像之间的闪烁。

1 个答案:

答案 0 :(得分:0)

您只需创建一个控制器监听器并等待onFinalImageSet(...)被触发,请参阅http://frescolib.org/docs/listening-to-events.html