Как получить ширину и высоту отображаемого изображения в Android?

Этот вопрос может показаться тривиальным и задавался много раз, но я не смог найти ответ, который мне подойдет.

У меня есть ImageView и GLSurfaceView, которые нарисованы поверх ImageView, когда я нажимаю кнопку.

Для моего ImageView я пропускаю Bitmap и уменьшаю его, чтобы избежать исключения OutOfMemoryError. Мой ImageView выровнен с другими элементами в моем пользовательском интерфейсе, поэтому он растягивает изображение, чтобы заполнить ширину/высоту (это то, что я хочу).

Когда я изменяю с ImageView на GLSurfaceView, я получаю черные области вокруг моего изображения, которые были прозрачными в моем ImageView, потому что GLSurfaceView делает дыру в пользовательском интерфейсе и работает не так, как обычные элементы, он рисует фон моего изображения к черному, и мне это не нужно, потому что у меня есть пользовательский фон.

Я пришел к решению, чтобы установить LayoutParams для GLSurfaceView программно, и я использую Bitmap ширину и высоту, но в итоге получаю уменьшенное изображение. Мне нужна точная ширина и высота отображаемого изображения, а не ImageView, потому что у него есть прозрачные области.

PS: я не эксперт по OpenGL, и если у вас есть решение, которое работает для OpenGL, поделитесь им.

а)

 _______________
|               |
|               |
|---------------|          <-
|   transparent |     
|---------------| <-            Entire
|               |               ImageView
|     Image     |   need
|               | only this
|---------------| <-
|   transparent |
|---------------|          <-
|               |
 ---------------

б)

 _______________
|               |
|               |
|---------------|       <-
|   black       |
|---------------|
|               |              
|    Image      |          GLSurfaceView
|               |
|---------------|
|   black       |
|---------------|       <-
|               |
 ---------------

Мои ImageView и GLSurfaceView:

<android.opengl.GLSurfaceView
    android:id="@+id/glsvImageHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/horScrollImage"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="50dp"
    android:visibility="invisible" />
<ImageView
    android:id="@+id/ivImageHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/horScrollImage"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="50dp"
    android:visibility="visible" />

Ответ 1

float widthPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
                                pxToMm(ivImageHolder.getWidth(), context), 
                                getResources().getDisplayMetrics());

float heightPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
                            pxToMm(ivImageHolder.getHeight(), context), 
                            getResources().getDisplayMetrics());

ViewGroup.LayoutParams layoutParams= glsvImageHolder.getLayoutParams();
layoutParams.width= (int) widthPx;
layoutParams.height= (int) heightPx;

glsvImageHolder.setLayoutParams(layoutParams);

Пиксель в ММ

public static float pxToMm(final float px, final Context context)
{
    final DisplayMetrics dm = context.getResources().getDisplayMetrics();
    return px / TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1, dm);
}

Сделайте GLSurfaceView шириной и высотой: wrap_content.