2014-12-11 32 views
11

To pytanie może wydawać się banalne i było wielokrotnie zadawane, ale nie mogłem znaleźć odpowiedzi, która będzie dla mnie odpowiednia.Jak uzyskać szerokość i wysokość wyświetlanego obrazu w systemie Android?

Mam I ImageView i GLSurfaceView, który jest narysowany na ImageView po naciśnięciu przycisku.

Dla mojego ImageView przekazuję Bitmap i skalowuję go, aby uniknąć wyjątku od OutOfMemoryError. Mój ImageView jest dopasowany do innych elementów w moim interfejsie, więc rozciąga obraz w celu wypełnienia szerokości/wysokości (tego właśnie chcę).

Kiedy zmienić ImageView do GLSurfaceView mam czarne obszary wokół mojego obrazu, które kiedyś być przejrzyste w moim ImageView, ponieważ GLSurfaceView robi dziurę w interfejsie użytkownika i działa inaczej niż zwykłych elementów rysuje tło mojego obrazu do czerni i I nie potrzebuję tego, ponieważ mam niestandardowe tło.

Znalazłem rozwiązanie, aby ustawić programowo LayoutParams dla GLSurfaceView i używam Bitmap szerokości i wysokości, ale kończę z mniejszym obrazem. Potrzebuję dokładnej szerokości i wysokości wyświetlanego obrazu - nie dlatego, że ma przezroczyste obszary.

PS: Nie jestem ekspertem OpenGL i jeśli masz rozwiązanie działające na OpenGL, udostępnij je.

)

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

b)

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

My ImageView i 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

Czy sama bitmapa zawiera przezroczyste regiony górny i dolny? –

+0

Nie, mapa bitowa nie zawiera przezroczystych regionów. –

Odpowiedz

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 MM

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

Ustaw szerokość i wysokość GLSurfaceView: wrap_content.

+0

Objaśnienie kodu byłoby przydatne. – Sipty