web-dev-qa-db-ja.com

ImageViewでDrawableの寸法を取得する方法は?

ImageViewでDrawableの寸法を取得する最良の方法は何ですか?

私のImageViewには、ImageViewを作成するInit-Methodがあります:

_private void init() {
    coverImg = new ImageView(context);
    coverImg.setScaleType(ScaleType.FIT_START);
    coverImg.setImageDrawable(getResources().getDrawable(R.drawable.store_blind_cover));
    addView(coverImg);
}
_

レイアウトまたは測定プロセスのある時点で、周囲のコンポーネントの残りを調整するために、Drawableの正確な寸法が必要です。

coverImg.getHeight()およびcoverImg.getMeasuredHeight()は必要な結果を返さず、coverImg.getDrawable().getBounds()を使用する場合、ImageViewでスケーリングされる前の寸法を取得します。

ご協力いただきありがとうございます!

42
notme

これを試してみたところ、うまくいきました:

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() {
        // Remove after the first run so it doesn't fire forever
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

ViewTreeObserverを使用すると、描画する直前にレイアウトを監視できます(つまり、すべてが既に測定されています)。ここから、ImageViewからスケーリングされた測定値を取得できます。

50
kcoppock

ドロアブルでgetIntrinsicHeightとgetIntrinsicWidthを呼び出します。

public int getIntrinsicHeight ()

以来:APIレベル1

基礎となる描画可能オブジェクトの固有の高さを返します。単色など、固有の高さがない場合は-1を返します。

public int getIntrinsicWidth ()

以来:APIレベル1

基礎となる描画可能オブジェクトの固有の幅を返します。

単色など、固有の幅がない場合は-1を返します。

http://developer.Android.com/reference/Android/graphics/drawable/Drawable.html#getIntrinsicHeight()

これは元のドロアブルのサイズです。これがあなたが望むものだと思います。

43
Pedro Loureiro

描画可能な寸法を取得する最も信頼性が高く強力な方法は、BitmapFactoryを使用してビットマップをデコードすることです。非常に柔軟です-描画可能なリソース、ファイル、またはその他のさまざまなソースから画像をデコードできます。

BitmapFactoryを使用して描画可能なリソースから寸法を取得する方法は次のとおりです。

BitmapFactory.Options o = new BitmapFactory.Options();
o.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
Bitmap bmp = BitmapFactory.decodeResource(activity.getResources(),
                                               R.drawable.sample_image, o);
int w = bmp.getWidth();
int h = bmp.getHeight();

Resの下で複数の密度のドロアブルフォルダーを使用する場合は注意してください。また、BitmapFactory.OptionsでinTargetDensityを指定して、必要な密度のドロアブルを取得するようにしてください。

20
ubzack

効率的な取得方法高さ of Drawable

Drawable drawable = getResources().getDrawable(R.drawable.ic_home);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Log.i("Drawable dimension : W-H", width+"-"+height);

これがお役に立てば幸いです。

9
Hiren Patel

これで問題が解決しました。画像全体を実際にロードすることなく、画像境界のサイズをデコードします。

BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.img , o);
int w = o.outWidth;
int h = o.outHeight;
6
Nevin Chen