2016-07-20 13 views
0

私のアプリでFrescoライブラリを使用してイメージをロードしています。 画像の高さを"wrap_content"に設定できないのは、Frescoライブラリで"wrap_content"がサポートされていないためです。 DraweeViewを使用して画像を見栄え良くするにはどうすればよいですか? 私はここに見えたが、私はこの問題の解決策を見つけることができませんでした:frescolib/wrap_contentFrescoライブラリのDraweeViewのサイズを "wrap_content"に設定する方法

例えば:

<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" /> 

はところで、画像の寸法は、あなたがCustomビュー拡張を作成することができます730 * 760

答えて

2

イメージの正確な寸法がわかっているので、の画像ののアスペクト比を計算し、XMLまたはJavaでアスペクト比を設定するだけです。 これはすぐに動作し、他の回答で示唆されているようなカスタムビューやDP /ピクセル計算は必要ありません。 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 --> 

またはJavaで:

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

あなたの例では、これは今、あなたはそれを設定することができます/ H = 760分の730 = 0.96052631578

wのだろう

また、http://frescolib.org/docs/using-drawees-xml.htmlも参照してください。

+0

ありがとうございました!!! –

1

あるSimpleDraweeViewその後、道以下

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

と同様に、この方法を使用し

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

注:あなたがそうでなければ、それは が動作していない、あなたのパッケージ名を適用していることを確認してください。 DPする

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

変換画素:下記の式を使用し、すべてのデバイスでDPするpxとPXにDPについて

+0

実際、私は自分の画像の実際の大きさを知っています。だから私はそれが最善の方法だとは思わない。 –

+0

@ItielMaimon寸法を知っていれば、それを直接適用します。 – Ironman

+0

寸法はピクセル単位で、どのくらいのdpiを入れるのか分かりません。 –

2

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

SimpleDraweeView直接寸法としてwrap_contentを許可しません。回避策は、上の答えが明らかに示すように、クラスを拡張することです。

式を使用して、必要な指標を正しく見つけ出し、プログラムによる引出線のレイアウトパラメータを設定します。

+0

どうもありがとうございました。しかし、XMLファイルの中の 'android:layout_height'にはどうしたらいいですか?私はそれを空のままにすることはできません –

+0

そして、私はどのようにプログラムでdraweeviewの高さを設定できますか? –

+0

DraweeViewのサイズを設定するのではなく、別のビューの中にLinearLayoutを入れて、Paramsを使ってその高さと幅を見つけたものに設定することです。 Draweeをmatch_parentのままにしておけば、うまくいくはずの設定された親境界に一致します。 – Kushan

関連する問題