2010-11-25 2 views
0

Ich habe eine Aktivität, die android:theme="@android:style/Theme.Dialog" verwendet. Die Aktivität enthält eine ImageView, die Bilder mit unterschiedlichen Dimensionen anzeigen kann. Die ImageView sollte das Bild so skalieren, dass es vollständig in das Fenster passt, zumindest passt die Achse vollständig und behält das ursprüngliche Seitenverhältnis bei. Die Größe des Dialogs sollte nur so groß wie die ImageView (plus seine Rahmenbreite) sein.So skalieren Sie das Bild in einer dialogartigen Aktivität auf die maximale Größe

Ich habe versucht, die folgend aber das Dialogfenster wird immer den gesamten zur Verfügung stehenden Raum:

<?xml version="1.0" encoding="UTF-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/imageParent" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dip"> 
    <ProgressBar 
     android:id="@android:id/progress" 
     android:layout_width="40dip" 
     android:layout_height="40dip" 
     android:layout_centerInParent="true" 
     android:visibility="gone" 
     style="@android:attr/progressBarStyleSmallTitle"/> 
    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:adjustViewBounds="true" 
     android:scaleType="fitCenter" 
     android:id="@+id/image"/> 
</RelativeLayout> 

Antwort

0

ich selbst eine Lösung gefunden, aber ich bin mir nicht ganz sicher, ob es die richtige Sache zu jeder gegebenen Situation tut. habe ich eine Unterklasse von Image (CustomImageView) und definiert die onMeasure() -Methode wie folgt:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    Drawable drawable = getDrawable(); 
    if (drawable != null) { 
     int measureHeight = View.MeasureSpec.getSize(heightMeasureSpec); 
     int measureWidth = View.MeasureSpec.getSize(widthMeasureSpec); 

     int resultWidth = measureWidth; 
     float scaleFactor = (float)resultWidth/drawable.getMinimumWidth(); 
     int resultHeight = (int)(scaleFactor * drawable.getMinimumHeight()); 

     if (resultHeight > measureHeight) { 
      resultHeight = measureHeight; 
      scaleFactor = (float)resultHeight/drawable.getMinimumHeight(); 
      resultWidth = (int)(scaleFactor * drawable.getMinimumWidth()); 
     } 

     setMeasuredDimension(resultWidth, resultHeight); 
    } else { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

} 

mein Layout nun wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/imageParent" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dip"> 
    <ProgressBar 
     android:id="@android:id/progress" 
     android:layout_width="40dip" 
     android:layout_height="40dip" 
     android:layout_centerInParent="true" 
     style="@android:attr/progressBarStyleSmallTitle" 
     android:visibility="gone"/> 
    <com.example.CustomImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:scaleType="fitCenter" 
     android:id="@+id/image"/> 
</RelativeLayout> 
Verwandte Themen