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でスケーリングされる前の寸法を取得します。
ご協力いただきありがとうございます!
これを試してみたところ、うまくいきました:
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
からスケーリングされた測定値を取得できます。
ドロアブルで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()
これは元のドロアブルのサイズです。これがあなたが望むものだと思います。
描画可能な寸法を取得する最も信頼性が高く強力な方法は、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を指定して、必要な密度のドロアブルを取得するようにしてください。
効率的な取得方法幅&高さ 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);
これがお役に立てば幸いです。
これで問題が解決しました。画像全体を実際にロードすることなく、画像境界のサイズをデコードします。
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;