2017-08-08 3 views
-1

J'ai un imageView dans une disposition en rangée que j'utilise pour un recyclerView. Le hauteur de ce imageView est mis à match_parent, mais pour que ce soit un carré parfait, je ne peux pas coder en dur le largeur du imageView.Je veux avoir une imageView être un carré parfait indépendamment de la hauteur

Ce que je besoin est un moyen de régler la largeur du imageView être exactement la même que la hauteur du imageView lorsqu'elle est affichée, depuis le réglage de la largeur wrap_content ou match_parent lancers francs le reste du mise en page car ce sont des images rectangulaires, de taille importante.

Toute aide serait appréciée.

Répondre

0

Vous pouvez faire quelque chose comme ceci:

public class FixedAspectRatioFrameLayout extends FrameLayout { 

private float ratio; 

public FixedAspectRatioFrameLayout(@NonNull Context context) { 
    super(context); 
} 

public FixedAspectRatioFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) { 
    super(context, attrs); 
    init(context, attrs); 
} 

private void init(Context context, AttributeSet attributeSet) { 
    fillFromAttrs(context, attributeSet); 
} 

private void fillFromAttrs(Context context, AttributeSet attributeSet) { 
    TypedArray array = context.obtainStyledAttributes(attributeSet, R.styleable.FixedAspectRatioFrameLayout); 

    ratio = array.getFloat(R.styleable.FixedAspectRatioFrameLayout_ratio, 0); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int originalWidth = MeasureSpec.getSize(widthMeasureSpec); 
    int originalHeight = MeasureSpec.getSize(heightMeasureSpec); 

    int finalWidth = originalWidth; 
    int finalHeight = originalHeight; 

    if (ratio != 0) { 

     if (originalHeight == 0) { 
      finalHeight = (int) (originalWidth/ratio); 
     } else if (originalWidth == 0) { 
      finalWidth = (int) (originalHeight * ratio); 
     } 

    } 
    super.onMeasure(
      MeasureSpec.makeMeasureSpec(finalWidth, MeasureSpec.EXACTLY), 
      MeasureSpec.makeMeasureSpec(finalHeight, MeasureSpec.EXACTLY) 
    ); 
} 
} 

Vous devez également spécifier l'attribut "rapport" dans votre res/valeurs/attrs.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<declare-styleable name="FixedAspectRatioFrameLayout"> 
    <attr name="ratio" format="float"/> 
</declare-styleable> 
</resources> 

Alors maintenant, vous pouvez spécifier, par exemple, hauteur de ce FrameLayout comme vous voulez, définir la largeur à 0dp et ratio à 1 et mettre votre ImageView dans ce FrameLayout

Aussi, dans ConstraintLayout si vous définissez la hauteur pour correspondre à des contraintes, vous pouvez s ratio pecify pour cette vue: enter image description here

+0

Je n'ai pas utilisé le code FrameLayout que vous avez affiché, mais l'astuce sur la disposition de contrainte a fait l'affaire. Je n'ai pas encore beaucoup travaillé avec, mais je vais certainement y réfléchir. Merci pour l'aide! – NielJ