Ни один из ответов здесь фактически не отвечает на вопрос:
Из Bitmap
любого размера, отображаемого ImageView
, найдите фактические размеры отображаемого изображения , а не размеры поставляемого Bitmap
.
А именно:
- Использование
ImageView.getDrawable().getInstrinsicWidth()
и getIntrinsicHeight()
вернет исходные размеры.
- Получение от
Drawable
до ImageView.getDrawable()
и приведение его к BitmapDrawable
, затем использование BitmapDrawable.getBitmap().getWidth()
и getHeight()
также возвращает исходное изображение и его размеры.
Единственный способ получить фактические размеры отображаемого изображения - извлечь и использовать преобразование Matrix
, используемое для отображения изображения в том виде, как оно показано. Это должно быть сделано после стадии измерения, и в приведенном здесь примере она вызывается в Override
из onMeasure()
для пользовательского ImageView
:
public class SizeAwareImageView extends ImageView {
public SizeAwareImageView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Get image matrix values and place them in an array
float[] f = new float[9];
getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY);
}
}
Примечание: Чтобы получить преобразование изображения Matrix
из кода в целом (как в Activity
), используется функция ImageView.getImageMatrix()
- например, myImageView.getImageMatrix()