2016-07-12 9 views
2

Ich habe eine benutzerdefinierte Ansicht mit einem DraweeHolder implementiert. Ich habe alle Callbacks und Listener für meine benutzerdefinierte Ansicht implementiert (attach/detach/invalidateDrawable/setListener).Benutzerdefinierte Ansicht und animiertes GIF - gif wird nicht richtig wiedergegeben

Wenn ich eine GIF-Bild-URL auf den Controller setzen - es spielt gif nicht richtig. Es aktualisiert das gif nur, wenn die Ansicht neu gezeichnet wird. Ich nehme an, dass animierte GIFs einen Invalidierungs-Callback oder ähnliches haben sollten.

P.S. Gif funktioniert ordnungsgemäß, wenn ich DraweeView verwende. Auch alle anderen Bilder funktionieren korrekt in meiner benutzerdefinierten Ansicht.

Erstellen von Inhaber:

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; 
} 

Einstellung Controller:

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()); 

Bild Anfrage:

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

Haben Sie die ausklappbaren Rückrufe festgelegt? Etwas wie 'mDraweeHolder.getTopLevelDrawable(). SetCallback (yourView);' –

+0

Wie Sie im ersten Block des Codes sehen können - es wird gesetzt –

Antwort

1

Es gibt keine individuelle Ungültigkeits Rückruf für GIFs, die animierte ziehbar nur invalidates itself für jede Rahmen, also wenn Sie die Rückrufe einstellen, sollte die Ungültigmachung gerade arbeiten.

Wenn jedoch Ihr Drawable-Rückruf (in Ihrem Fall parent) nicht den korrekten Bereich (oder alles) ungültig macht, wird die animierte Zeichnungsinvalidierung nicht korrekt aktualisiert. Ein Beispiel, wenn dies passieren kann, ist, wenn der Rückruf die genaue Position der Drawable nicht kennt und einen falschen Bereich ungültig macht. Sie können versuchen, die Drawable.Callback Ihrer benutzerdefinierten Ansicht zu debuggen, oder schreiben Sie eine benutzerdefinierte Drawable.Callback Klasse, die die gesamte Ansicht einschließlich der GIF-Zeichen ungültig macht.

Stellen Sie außerdem sicher, dass Sie verifyDrawable außer Kraft setzen und alle anderen Schritte für benutzerdefinierte Ansichten befolgen, wie in der Custom View documentation beschrieben.

+0

Können Sie Beispiel zeigen, wie ich Callback zu animiertem Zeichen hinzufügen kann. –

+0

Werfen Sie einen Blick auf http://frescolib.org/docs/animations.html - dies zeigt, wie Sie die Animation manuell starten und stoppen. –

+0

Sie Link hat mir nicht viel geholfen. Können Sie mehr Anhaltspunkte oder ein Beispiel liefern, wie eine animierte Fresko-Ansicht (GIF in Fresco-Drawee) meine benutzerdefinierte Elternansicht während ihrer Wiedergabe ungültig machen kann? –