2017-02-16 4 views
0

Ich versuche, eine benutzerdefinierte Ansicht, die mehrere Bilder in einer Ansicht mit Fresco zeigt. Ich habe die Dokumente gelesen und einige Schritte durchlaufen, aber meine Implementierung scheint nicht zu funktionieren. Hier ist der Code:Fresko mehrere Bilder anzeigen

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

Die Logik hinter meinem Code ist die Ansicht, sobald die Bild-Downloads in onFinalImageSet ungültig zu machen, so zeichnet es. Aber die Drawables zeichnen nicht. Wenn ich dann die App an den Hintergrund sende und wieder öffne, damit onStart erneut aufgerufen wird, zeigen die Drawables an. Fehle ich hier etwas oder gibt es ein Beispiel für eine benutzerdefinierte DraweView, die View und nicht ImageView erweitert?

Antwort

1

Sie müssen die Drawable.Callback setzen, wie hier beschrieben: http://frescolib.org/docs/writing-custom-views.html

Stellen Sie außerdem sicher, dass der Rückruf entkräftet tatsächlich die richtige ist. Wenn Sie die falsche ungültig machen, wird es auch nicht funktionieren.

+0

Also alles was ich vermisse, ist 'draweeHolder.getTopLevelDrawable(). SetCallback (this);' Nach 'draweeHolder.setController (Controller);'? –

+0

Ja. Sie können den Code auch vereinfachen, Sie sollten 'ControllerListener' nicht benötigen. –

+0

Ich hatte das Gefühl, dass ich ungültig machen muss, nachdem das Bild eingestellt wurde. Danke für die Antwort +1 –