2012-11-29 18 views
10

Sto tentando di mostrare un ImageView che è sempre di forma quadrata all'interno di una finestra di dialogo. Le dimensioni possono variare a seconda della risoluzione del display (Larghezza in verticale per la precisione) ma è necessario ImageView per formare il quadrato più grande possibile per contenere un'immagine quadrata al suo interno. Questo è il mio codice XML per lo stesso.Square ImageView

<ImageView 
    android:id="@+id/dialog_image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scaleType="centerInside" 
    android:adjustViewBounds="true" 
    /> 

ma il problema è che l'immagine Square è impostato in modo dinamico in fase di esecuzione e l'ImageView finisce per essere un rettangolo con largo come la dimensione immagine Square. Cosa posso fare per ottenere lo stesso?

MODIFICA: Per dare un'idea di ciò che sto cercando di ottenere è come ciò che viene mostrato quando si seleziona un contatto nell'applicazione Contatti e si fa clic sull'immagine del profilo. Si ingrandisce e rimane come un quadrato in cima all'attività.

risposta

13

impostare l'altezza vista immagine in fase di esecuzione, ma in primo luogo ottenere la larghezza di visualizzazione con questo codice

Display display = getWindowManager().getDefaultDisplay(); 
int swidth = display.getWidth(); 

e ora impostare l'altezza di vista dell'immagine come questo

LayoutParams params = eventImage.getLayoutParams(); 
params.width = LayoutParams.FILL_PARENT; 
params.height = swidth ; 
eventImage.setLayoutParams(params); 
+0

Grazie molto molto per la risposta. Funziona come un fascino. – Shakti

3

Creare una classe separata per definendo la dimensione in modo dinamico per il tuo ImageView che dovrebbe ereditare la classe ImageView come mostrato di seguito:

public class SquareImageView extends ImageView { 

public SquareImageView(Context context) { 
    super(context); 
} 

public SquareImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public SquareImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, widthMeasureSpec); 

int width = getMeasuredWidth(); 
    setMeasuredDimension(width, width); 

} 

}

The setMeasuredDimension (larghezza, larghezza); imposterà automaticamente la tua altezza come larghezza.

Nel file xml utilizzare questa classe come una visione in luogo di ImageView come illustrato di seguito:

<com.packagepath.SquareImageView 
     android:id="@+id/Imageview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
+0

molto grazie, questo ha funzionato molto bello –

+0

Ur welcome .. :) – HAXM

0

Crea il tuo ImageView che dovrebbe ereditare la classe ImageView come illustrato di seguito:

public class SquareImageView extends AppCompatImageView { 
    public SquareImageView(Context context) { 
     super(context); 
    } 

    public SquareImageView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SquareImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = MeasureSpec.getSize(heightMeasureSpec); 
     int size; 

     //If the layout_width or layout_width of this view is set as match_parent or any exact dimension, then this view will use that dimension 
     if(MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY^MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) { 
      if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) 
       size = width; 
      else 
       size = height; 
     } 
     //If the layout_width and layout_width of this view are not set or both set as match_parent or any exact dimension, 
     // then this view will use the minimum dimension 
     else 
      size = Math.min(width, height); 
     setMeasuredDimension(size, size); 
    } 
}