2017-01-28 4 views
2

ImageViewのサイズを幅に基づいて長方形にしたい場合は、onGlobalLayout()を上書きしてphoto.getWidth()とします。しかし、それは肖像画の画面でのみ動作し、横画面では動作しません。ImageView.getWidth()ランドスケープとポートレートの画面で同じ値を返します

:風景で

enter image description here

、画像が

enter image description here

を成形し、これはコードであるが矩形ではない:

肖像が正常に動作していますfragment_productdetail.xml

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:orientation="horizontal"> 
    <ImageView 
     android:id="@+id/ivImage0" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_margin="3dp" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true" 
     android:src="@drawable/noimage"/> 
    <ImageView 
     android:id="@+id/ivImage1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_margin="3dp" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true" 
     android:src="@drawable/noimage"/> 
    <ImageView 
     android:id="@+id/ivImage2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_margin="3dp" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true" 
     android:src="@drawable/noimage"/> 
    <ImageView 
     android:id="@+id/ivImage3" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_margin="3dp" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true" 
     android:src="@drawable/noimage"/> 
</LinearLayout> 

FragmentProductDetail.java

ivPhotos[0] = (ImageView) inflatedView.findViewById(R.id.ivImage0); 
ivPhotos[1] = (ImageView) inflatedView.findViewById(R.id.ivImage1); 
ivPhotos[2] = (ImageView) inflatedView.findViewById(R.id.ivImage2); 
ivPhotos[3] = (ImageView) inflatedView.findViewById(R.id.ivImage3); 

for (final ImageView photo : ivPhotos) { 
    photo.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      photo.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      photo.getLayoutParams().height = photo.getWidth(); 
     } 
    }); 
} 

は、その後、私は風景の中に幅を取得するために)(onGlobalLayout内Log.i("zihad", ""+photo.getWidth());入れてみてください、それは私の肖像画の幅の同じ値を与えます。だから私はそれを肖像画と風景で動作させるために何をすべきですか?

*の悪い英語のため申し訳ありませんが、私は私の英語

+0

申し訳ありませんが、達成したいことと表示されていることを視覚的に表現できますか?これは私が質問を編集し、答えを提供するのに役立ちます。 –

+0

ああ申し訳ありませんが、 – zihadrizkyef

+0

私はそれを編集しました:D – zihadrizkyef

答えて

1

クイックヒントを向上させるためにも、ここで頼む:

これはあなたが望むものであるならば、私は、わかりません。私が想定しているところから、私はSquare ImageViewでレイアウトが必要かもしれないと思います。レンダリング後にレイアウトを変更しようとする場合は、その高さを設定する前にphoto.requestLayout();に電話する必要があります。

別の解決策は、SquareImageViewを使用することです。これを実現するには、ImageViewを拡張し、そのようなonMeasureをオーバーライドして高さを設定するViewを作成するだけです。

public class MyImageView extends ImageView { 

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int width = getMeasuredWidth(); 
    setMeasuredDimension(width, width); 
} 

レイアウトでは、ImageViewをMyImageView(完全なパッケージ名)に置き換えてください。

+0

私はgetMeasuredWidth()の代わりにgetWidth()を使用できますか? – zihadrizkyef

+0

できません。 getMeasuredWidth()はonLayoutの前に呼び出されます。したがって、getWidthをここで呼び出すことはできません。 –

+0

私は恐怖ですgetMeasuredWidth()は私に実際の幅を与えません – zihadrizkyef

関連する問題