ImageView sei ein Quadrat mit dynamischer Breite?

Ich habe ein GridView mit ImageViews im Inneren. Ich habe 3 von ihnen für jede Zeile. Ich kann die Breite mit WRAP_CONTENT und scaleType = CENTER_CROP korrekt einstellen, aber ich weiß nicht, wie man die Größe des ImageViews als ein Quadrat festlegt. Hier ist was ich bis jetzt getan habe, es scheint ok zu sein außer der höhe, das ist "statisch":

imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT, 300)); 

Ich mache es in einem Adapter.

  • Wie teste ich den android.max_aspect für Galaxy S8
  • Durchsuchen von Daten in Android SQLite Datenbank
  • Videoaufzeichnungsformat (.3gp oder mp4) in android?
  • Android gradle build Fehler: (9, 0) Gradle DSL Methode nicht gefunden: 'compile ()'.
  • Gibt es eine Möglichkeit zu wissen, ob eine bestimmte Abhängigkeit in der Gradle-Datei kompiliert wird, indem sie einen Booleschen zurückgibt
  • Android png optimierung
  • View getVisibility () isShown () gibt falsche Sichtbarkeit zurück
  • Machen Sie ein Android-Handy als Bluetooth-Eingabegerät (Maus oder Tastatur)
  • ViewPager OnLongClick Hörer nicht abfeuern
  • Fehler: Parsing das Paket bei der Installation von APK
  • Wie bekomme ich einen zufälligen Wert aus einem String-Array in Android?
  • Wie man eine ActionBar wie Google Play macht, die beim Scrollen einbringt
  • 5 Solutions collect form web for “ImageView sei ein Quadrat mit dynamischer Breite?”

    Die beste Option besteht darin, ImageView selbst zu subklassen und den Messwert zu überschreiten:

     public class SquareImageView extends ImageView { ... @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = getMeasuredWidth(); setMeasuredDimension(width, width); } ... } 

    Die andere Antwort funktioniert gut. Dies ist nur eine Erweiterung der Bertucci-Lösung, um ein ImageView mit quadratischer Breite und Höhe in Bezug auf xml aufgeblasenes Layout zu machen.

    Erstellen Sie eine Klasse, sagen Sie ein SquareImageView erweitern ImageView wie folgt,

     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, heightMeasureSpec); int width = getMeasuredWidth(); setMeasuredDimension(width, width); } } 

    Nun, in deinem xml mach das,

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

    Wenn du ein ImageView benötigst, um nicht dynamisch im Programm zu erstellen, sondern stattdessen in xml behoben zu werden, dann ist diese Implementierung hilfreich.

    Noch einfacher:

     public class SquareImageView extends ImageView { ... @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } } 

    Mehrere der bisherigen Antworten sind völlig ausreichend. Ich bin nur eine kleine Optimierung für @Andro Selva und @ a.bertucci's Lösungen hier:

    Es ist eine winzige Optimierung, aber die Überprüfung, dass die Breite und die Höhe unterschiedlich sind, könnte einen anderen Messdurchgang verhindern.

     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(); int height = getMeasuredHeight(); // Optimization so we don't measure twice unless we need to if (width != height) { setMeasuredDimension(width, width); } } } 

    Hier sind alle unnötige nennen seine onMeasure für onMeasure . Hier ist meine Umsetzung

     @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int size = Math.min(width, height); setMeasuredDimension(size, size); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.