首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fresco多图像视图

Fresco多图像视图
EN

Stack Overflow用户
提问于 2017-02-16 20:36:09
回答 1查看 773关注 0票数 0

我正在尝试用Fresco制作一个自定义视图,将多个图像显示在一个视图中。我已经阅读了文档并经历了一些步骤,但我的实现似乎不起作用。代码如下:

代码语言:javascript
复制
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示例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 23:42:23

您需要按如下所述设置Drawable.Callbackhttp://frescolib.org/docs/writing-custom-views.html

另外,确保回调实际上使正确的回调无效。如果您使错误的一个无效,它也不会工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42274171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档