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?
Also alles was ich vermisse, ist 'draweeHolder.getTopLevelDrawable(). SetCallback (this);' Nach 'draweeHolder.setController (Controller);'? –
Ja. Sie können den Code auch vereinfachen, Sie sollten 'ControllerListener' nicht benötigen. –
Ich hatte das Gefühl, dass ich ungültig machen muss, nachdem das Bild eingestellt wurde. Danke für die Antwort +1 –