Fresco 多图像视图

Fresco multiple images view

我正在尝试使用 Fresco 制作一个将多张图像显示到一个视图中的自定义视图。我已阅读文档并完成了一些步骤,但我的实施似乎不起作用。这是代码:

public class MultiDraweeView extends View {

    private static final int MAX_COUNT = 4;

    private MultiDraweeHolder<GenericDraweeHierarchy> multiDraweeHolder;
    private ArrayList<GenericDraweeHierarchy> hierarchies;

    public MultiDraweeView(Context context) {
        super(context);
        init();
    }

    public MultiDraweeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MultiDraweeView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        multiDraweeHolder = new MultiDraweeHolder<>();
        hierarchies = new ArrayList<>();
        for (int i = 0; i < MAX_COUNT; i++) {
            hierarchies.add(new GenericDraweeHierarchyBuilder(getResources())
                    .build());
        }
    }

    public void setImageUris(Uri... uris) {
        multiDraweeHolder.clear();
        for (int i = 0; i < (uris.length < MAX_COUNT ? uris.length : MAX_COUNT); i++) {
            final int j = i;
            final DraweeHolder<GenericDraweeHierarchy> draweeHolder = DraweeHolder.create(hierarchies.get(i), getContext());
            DraweeController controller = Fresco.newDraweeControllerBuilder()
                    .setUri(Uri.parse("http://www.thewrap.com/wp-content/uploads/2015/11/Donald-Trump.jpg"))
                    .setOldController(draweeHolder.getController())
                    .setControllerListener(new ControllerListener<ImageInfo>() {
                        @Override
                        public void onSubmit(String id, Object callerContext) {
                            Log.e("fresco" + j, "onSubmit");
                        }

                        @Override
                        public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
                            Log.e("fresco" + j, "onFinalImageset");
                            invalidate();
                        }

                        @Override
                        public void onIntermediateImageSet(String id, ImageInfo imageInfo) {
                            Log.e("fresco" + j, "onIntermediateImageSet");
                        }

                        @Override
                        public void onIntermediateImageFailed(String id, Throwable throwable) {
                            Log.e("fresco" + j, "onIntermediateImageFailed");
                        }

                        @Override
                        public void onFailure(String id, Throwable throwable) {
                            Log.e("fresco" + j, "onFailure");
                        }

                        @Override
                        public void onRelease(String id) {
                            Log.e("fresco" + j, "onRelease");
                        }
                    })
                    .build();
            draweeHolder.setController(controller);
            multiDraweeHolder.add(draweeHolder);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.e("fresco", "ondraw");
        for (int i = 0; i < multiDraweeHolder.size(); i++) {
            Drawable drawable = multiDraweeHolder.get(i).getTopLevelDrawable();
            drawable.setBounds(50 * i, 50 * i, 50 * (i + 1), 50 * (i + 1));
            drawable.draw(canvas);
        }
    }

    @Override
    protected boolean verifyDrawable(@NonNull Drawable who) {
        return multiDraweeHolder.verifyDrawable(who);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        multiDraweeHolder.onDetach();
    }

    @Override
    public void onStartTemporaryDetach() {
        super.onStartTemporaryDetach();
        multiDraweeHolder.onDetach();
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        multiDraweeHolder.onAttach();
    }

    @Override
    public void onFinishTemporaryDetach() {
        super.onFinishTemporaryDetach();
        multiDraweeHolder.onAttach();
    }
}

我的代码背后的逻辑是在图像下载后立即使视图无效onFinalImageSet,以便重新绘制。但是 Drawables 没有绘图。如果然后我将应用程序发送到后台并再次打开它以便再次调用 onStart,则 Drawables 显示。我在这里遗漏了什么,或者是否有任何扩展 View 而不是 ImageView 的自定义 DraweView 的示例?

您需要设置 Drawable.Callback as described here: http://frescolib.org/docs/writing-custom-views.html

此外,请确保回调实际上使正确的区域无效。无效化错了,同样无效