我已经实现了一个包含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();
}
答案 0 :(得分:1)
GIF没有自定义的无效回调,每帧的动画可绘制只有invalidates itself,所以如果设置回调,则无效就应该有效。
但是,如果您的Drawable回调(在您的情况下为parent
)不会使正确的区域(或所有内容)无效,则动画可绘制的失效将无法正确刷新。
可能发生这种情况的一个例子是当回调不知道Drawable的确切位置并使错误区域无效时。
您可以尝试调试自定义视图的Drawable.Callback
内容,也可以编写自定义Drawable.Callback
类,使整个视图无效,包括GIF drawable。
此外,请务必覆盖verifyDrawable
,并按照Custom View documentation中的说明执行自定义视图的所有其他步骤。