2016-07-20 13 views
0

Ich benutze die Fresco Bibliothek in meiner App, um Bilder zu laden. Das Problem ist, dass ich meine Bilderhöhe nicht auf "wrap_content" festlegen kann, da "wrap_content" in der Bibliothek Fresco nicht unterstützt wird. Also, wie kann ich meine Bilder mit einer DraweeView gut aussehen lassen? Ich sah hier, aber ich konnte keine Lösung für dieses Problem finden: frescolib/wrap_contentWie man Dimensionen einer DraweeView auf "wrap_content" in der Fresko-Bibliothek setzt

Zum Beispiel:

<com.facebook.drawee.view.SimpleDraweeView 
     android:id="@+id/intro_image1" 
     android:layout_width="match_parent" 
     android:layout_height= // Can't use "wrap_content" 
     fresco:placeholderImage="@drawable/placeholder_image" /> 

BTW die Bilder Abmessungen 730 * 760

Antwort

2

Da Sie die genauen Abmessungen des Bildes bereits kennen, können Sie einfach das Seitenverhältnis Ihres Bildes berechnen und dann das Seitenverhältnis einfach in XML oder Java einstellen. Dies funktioniert sofort und Sie benötigen keine benutzerdefinierten Ansichten oder DP/Pixel-Berechnungen, wie in anderen Antworten vorgeschlagen.

Für Ihr Beispiel würde dies w/h = 730/760 = ,96052631578

Jetzt können Sie es einfach einstellen: In XML:

<com.facebook.drawee.view.SimpleDraweeView 
    android:id="@+id/my_image_view" 
    android:layout_width="match_parent" <!-- or the desired width --> 
    android:layout_height="wrap_content" 
    fresco:viewAspectRatio="0.96052631578" <!-- your aspect ratio --> 
    <!-- other attributes --> 

Oder in Java:

mSimpleDraweeView.setAspectRatio(0.96052631578f); // or whatever your aspect ratio is 

Siehe auch http://frescolib.org/docs/using-drawees-xml.html ganz unten.

+0

Vielen Dank !!! –

1

Sie erstellen können Custom Blick reicht SimpleDraweeView unten wie Art und Weise

public class WrapContentDraweeView extends SimpleDraweeView { 

    // we set a listener and update the view's aspect ratio depending on the loaded image 
    private final ControllerListener listener = new BaseControllerListener<ImageInfo>() { 
     @Override 
     public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) { 
      updateViewSize(imageInfo); 
     } 

     @Override 
     public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) { 
      updateViewSize(imageInfo); 
     } 
    }; 

    public WrapContentDraweeView(Context context, GenericDraweeHierarchy hierarchy) { 
     super(context, hierarchy); 
    } 

    public WrapContentDraweeView(Context context) { 
     super(context); 
    } 

    public WrapContentDraweeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void setImageURI(Uri uri, Object callerContext) { 
     DraweeController controller = ((PipelineDraweeControllerBuilder)getControllerBuilder()) 
       .setControllerListener(listener) 
       .setCallerContext(callerContext) 
       .setUri(uri) 
       .setOldController(getController()) 
       .build(); 
     setController(controller); 
    } 

    void updateViewSize(@Nullable ImageInfo imageInfo) { 
     if (imageInfo != null) { 
      setAspectRatio((float) imageInfo.getWidth()/imageInfo.getHeight()); 
     } 
    } 
} 

und dann auf diese Weise verwenden

<com.example.ui.views.WrapContentDraweeView 
    android:id="@+id/simple_drawee_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 

Hinweis: Stellen Sie sicher, dass Sie Ihre Paketnamen angelegt haben Ansonsten ist es nicht funktioniert.

+0

Eigentlich kenne ich die wirklichen Dimensionen meiner Bilder. Also ich denke nicht, dass es der beste Weg ist. –

+0

@ItielMaimon Wenn Sie Dimension wissen, wenden sie es direkt an. – Ironman

+0

Die Abmessungen sind in Pixel und ich weiß nicht, wie viel dpi zu setzen? –

2

Für dp px und px auf allen Geräten dp, verwenden Sie die folgende Formel:

Convert dp to pixel: 

public int dpToPx(int dp) { 
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); 
int px = Math.round(dp * (displayMetrics.xdpi/DisplayMetrics.DENSITY_DEFAULT));  
return px; 
} 

Convert Pixel dp:

public int pxToDp(int px) { 
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); 
int dp = Math.round(px/(displayMetrics.xdpi/DisplayMetrics.DENSITY_DEFAULT)); 
return dp; 
} 

SimpleDraweeView nicht direkt wrap_content als Dimension ermöglichen . Die Arbeit besteht darin, die Klasse zu erweitern, wie die obige Antwort deutlich zeigt.

Verwenden Sie die Formel, um die benötigte Metrik korrekt zu finden, und legen Sie die Layoutparameter für Ihre draweeview programmatisch fest.

+0

Danke sieht sehr gut aus, aber was sollte ich in die 'android: layout_height' in der XML-Datei einfügen? Ich kann es nicht leer lassen –

+0

Und wie kann ich die Höhe der Draweeview programmgesteuert festlegen? –

+0

Ich bin nicht sicher über die Größe von DraweeView, stattdessen, was Sie tun können, ist es in einer anderen Ansicht sagen ein LineareLayout und verwenden Sie seine Parameter, um seine Höhe und Breite zu den gefundenen festzulegen. Halten Sie die Drawee auf "match_parent" und es stimmt mit den gesetzten übergeordneten Grenzen überein, die gut funktionieren sollten. – Kushan