自定义视图和动画GIF - gif无法正常播放

时间:2016-07-12 12:10:43

标签: android fresco

我已经实现了一个包含DraweeHolder的自定义视图。我为自定义视图实现了所有回调和监听器(attach / detach / invalidateDrawable / setListener)。

如果我将GIF图像网址设置为控制器 - 它无法正确播放gif。只有在重绘视图时才会刷新gif。我想动画GIF应该有一些无效回调或其他东西。

P.S。如果我使用DraweeView,Gif可以正常工作。所有其他图像也可以在我的自定义视图中正常工作。

创建持有人:

private DraweeHolder<GenericDraweeHierarchy> createComponentHolder(View parent, Context context) {
    GenericDraweeHierarchy componentHierarchy = new GenericDraweeHierarchyBuilder(parent.getResources())
            .setRoundingParams(RoundingParams.fromCornersRadius(LayoutHelper.dp(3)).setBorder(Theme.COLOR_MEDIA_BORDER, 1))
            .build();
    DraweeHolder<GenericDraweeHierarchy> holder = DraweeHolder.create(componentHierarchy, context);
    holder.getTopLevelDrawable().setCallback(parent);
    return holder;
}

设置控制器:

PipelineDraweeControllerBuilder controllerBuilder = Fresco.newDraweeControllerBuilder()
            .setImageRequest(MediaHelper.getImageRequest(filePath))
            .setAutoPlayAnimations(true)
            .setControllerListener(controllerListener)
            .setOldController(draweeHolder.getController());

    if (thumbUrl != null) {
        controllerBuilder.setLowResImageRequest(getThumbnailRequest(thumbUrl));
    }

    draweeHolder.setController(controllerBuilder.build());

图片请求:

public static ImageRequest getImageRequest(String filePath) {
    int imageSize = LayoutHelper.dp(100);
    return ImageRequestBuilder.newBuilderWithSource(Uri.fromFile(new File(filePath)))
            .setResizeOptions(new ResizeOptions(imageSize, imageSize))
            .setAutoRotateEnabled(true)
            .build();
}

1 个答案:

答案 0 :(得分:1)

GIF没有自定义的无效回调,每帧的动画可绘制只有invalidates itself,所以如果设置回调,则无效就应该有效。

但是,如果您的Drawable回调(在您的情况下为parent)不会使正确的区域(或所有内容)无效,则动画可绘制的失效将无法正确刷新。 可能发生这种情况的一个例子是当回调不知道Drawable的确切位置并使错误区域无效时。 您可以尝试调试自定义视图的Drawable.Callback内容,也可以编写自定义Drawable.Callback类,使整个视图无效,包括GIF drawable。

此外,请务必覆盖verifyDrawable,并按照Custom View documentation中的说明执行自定义视图的所有其他步骤。