2014-12-11 5 views
11

Этот вопрос может показаться тривиальным и задан много раз, но я не мог найти ответ, который будет работать для меня.Как получить ширину и высоту отображаемого изображения в android?

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

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

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

Я пришел с решением, чтобы установить 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" /> 
+0

Содержит ли растровое изображение верхнюю и нижнюю прозрачные области? –

+0

Нет, растровое изображение не содержит прозрачных областей. –

ответ

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

Pixel ММ

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.

+0

Объяснение кода было бы удобно. – Sipty