android.widget.ImageViewの幅と高さを取得する方法は?


272
╔══════════════════════════════════════════════╗   ^
 ImageView    ╔══════════════╗                   |
                                               |
               Actual image                    |
                                               |60px height of ImageView
                                               |
                                               |
              ╚══════════════╝                   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

デフォルトの高さと幅の画像ビューがあります。画像はdbに保存されており、Imageviewの高さの幅に応じて画像をスケーリングします。高さと幅を変更するときはいつでもコードで変更する必要があるため、デフォルト値を指定したくありません。

ImageViewの高さと幅を取得しようとしていますが、どちらの場合も0が返されます。

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

これはデフォルトの高さと幅があっても0を返します


«デフォルトの値を指定したくないので、高さと幅を変更するときは、コードでも変更する必要があります»-どれを変更できますか?画像ビューまたは保存された画像?
Pedro Loureiro、2011年

そのまま使えないのandroid:scaleType="centerInside"
bigstones 2011年

2
@nightcracker:それはASCIIではありません。
Joey

7
@Јοеу私が「ASCII」と言ったとき、私は「ASCIIアート」を意味しました。これは、ASCII文字セットだけで構成されるアートよりも多くのアートを網羅しています。
orlp 2013

1
これは直接質問に答えるものではありませんが、getHeight()/ getWidth()が0を返す理由に疑問がある場合、ビューが「描画」される前にこれらのメソッドを呼び出すと、つまり、 onCreate()でこれらのメソッドを呼び出すと、0が返されます
audiojared

回答:


222

この質問に対する私の答えはあなたを助けるかもしれません:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

次に、onPreDraw()メソッド内から画像スケーリング作業を追加できます。


8
とても素敵なコード兄弟とそのための論理的な+1。ImageViewプロパティandroid:adjustViewBounds = "true"をtrueに設定することによってもこれを実現できます:)
AZ_

でも、ポインタをデバッグしている間はonPreDraw()を実行しないでください。なぜそうなのでしょうか。
Geetanjali

3
vto.removeOnPreDrawListener(this);を追加する必要があると思います。onPreDraw()内の行
sagus_helgy 2013年

1
@ KK_07 Suffererのコメントに従って編集を参照してください。使い終わったらリスナーを削除するだけです。
Kevin Coppock 2014年

6
finalにせずに、内部クラス内のfinalHeightおよびfinalWidthに値をどのように割り当てますか?
クリス

29

このプロパティを設定するだけで、Android OSがすべての処理を実行します。

android:adjustViewBounds = "true"

ImageView:Dを配置したlayout.xmlでこれを使用します


4
@jww私は実際には否定的な投票者に返信しません:p、まずAndroidのドキュメントでgetWidthとgetMeasuredについて読みます。その後、人々を投票してください。
AZ_ 2014

27

ドローアブルで画像の幅と高さを取得できました。

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();

14

ImageViewの寸法が0である理由は、それらをクエリしているときに、ビューがまだレイアウトと測定の手順を実行していないためです。レイアウトでの「動作」をビューに伝えただけで、各ビューの配置場所はまだ計算されていません。

画像ビューに与えるサイズをどのように決定しますか?ネイティブに実装されたスケーリングオプションの1つを単に使用できないのですか?


ImageViewにデフォルトの高さと幅を指定しましたが、コードで取得しようとすると、0が返されます。最初にImageViewを膨らませる必要があると思います。しかし、どうやって?
AZ_ 2011年

私はそれを私の答えで扱います。もう一度読んでください:)あなたの意見はすでに膨らんでいると思います。見えますか?できれば膨らませる。
Pedro Loureiro、2011年

13

UIスレッドへの投稿が機能します。

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});

本当に役に立ちました!
Xavi Jimenez

違う。UIから幅と高さをクエリしても、それらの値が準備できているとは限りません。ビューのインフレーションはたまたまサンプルで終了しましたが、それ以外の場合は非常によくあるかもしれません
rommex

6

あなたのxmlファイル:

 <ImageView android:id="@+id/imageView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/image"
               android:scaleType="fitXY"
               android:adjustViewBounds="true"/>

あなたのJavaファイル:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();

5

これはAndroid OSに任せることができると思います。ImageViewのスケールタイプをに設定するfitXYと、表示される画像は、ビューの現在のサイズに合わせてサイズ変更されます。

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />

4

最も簡単な方法は、アクティビティのonWindowFocusChangedメソッドでImageViewの幅と高さを取得することです

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}

1
onWindowFocusChangedはAPI18以降でのみ機能し、最善の方法にはなりません...しかし、ありがとう
Milad gh

1

複数の画像を動的に作成した場合は、これを試してください。

// 画像配列を初期化します

private ImageView myImages[] = new ImageView[your_array_length];

// プログラム作成し、親ビューに追加します

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

// それでおしまい。ハッピーコーディング。


-2

これによる私の友人は、dbに格納されている画像の高さを取得していませんが、ビューの高さを取得しています。画像の高さを取得するには、db、sの画像からビットマップを作成する必要があります。


2
画像の高さと幅は知っていますが、ImageViewの高さと幅を知りたいので、それに合わせて拡大縮小できます。私の要点を理解してもらいたい。
AZ_ 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.