web-dev-qa-db-ja.com

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

╔══════════════════════════════════════════════╗   ^
║ 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を返します

267
AZ_

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

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()メソッド内から画像の拡大縮小作業を追加できます。

216
kcoppock

このプロパティを設定しただけで、今やAndroid OSがあらゆることに気を配っています。

Android:adjustViewBounds = "true"

ImageViewを植えたあなたのlayout.xmlでこれを使ってください:D

27
AZ_

画像の幅と高さはその描画可能要素によって得られます。

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

ImageViewの寸法が0である理由は、それらを照会しているとき、ビューはまだレイアウトと測定のステップを実行していないためです。あなたはそれがレイアウトの中でどのように "振る舞う"かについてビューに言いました、しかしそれはまだ各ビューをどこに置くべきか計算しませんでした。

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

13
Pedro Loureiro

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

            }
});
11
element6

あなたの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();
4
omor

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

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

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

}
4
Aqib

私はあなたがAndroid OSにあなたのためにこれの世話をさせることができると思います。 ImageViewのスケールタイプをfitXYに設定すると、表示される画像は現在のビューサイズに合わせてサイズ調整されます。

<ImageView 
    Android:layout_width="90px" 
    Android:layout_height="60px"
    Android:scaleType="fitXY" />
4
Ian Leslie

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

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

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

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

1
Hiren Patel