2014-12-11 16 views
11

Questa domanda può sembrare banale e mi è stata chiesta molte volte, ma non sono riuscito a trovare una risposta che funzionasse per me.Come ottenere larghezza e altezza dell'immagine visualizzata in Android?

Ho un ImageView e GLSurfaceView che viene disegnato sopra ImageView quando si preme un pulsante.

Per il mio ImageView passaggio uno Bitmap e ridimensionarlo per evitare un'eccezione OutOfMemoryError. Il mio ImageView è allineato ad altri elementi nell'interfaccia utente, quindi estende l'immagine per riempire larghezza/altezza (questo è quello che voglio).

Quando cambio da ImageView a GLSurfaceView ottengo regioni nere intorno la mia immagine che utilizzate per essere trasparente nella mia ImageView, perché GLSurfaceView fa un buco utente e funziona in modo diverso rispetto agli elementi usuali trae sfondo della mia immagine in bianco e io non ne ho bisogno, perché ho uno sfondo personalizzato.

Sono sceso con una soluzione per impostare LayoutParams per GLSurfaceView a livello di codice e io uso la larghezza e l'altezza di Bitmap, ma ho finito con un'immagine più piccola. Ho bisogno dell'esatta larghezza e altezza dell'immagine visualizzata, non dello ImageView perché ha regioni trasparenti.

PS: Non sono un esperto di OpenGL e se si dispone di una soluzione che funziona per OpenGL, si prega di condividerlo.

una)

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

b)

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

mio ImageView e 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

La bitmap stessa contiene regioni superiori e inferiori trasparenti? –

+0

No, la bitmap non contiene regioni trasparenti. –

risposta

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

Rendi la larghezza e l'altezza di GLSurfaceView: wrap_content.

+0

Una spiegazione del codice sarebbe utile. – Sipty