ImageView是一个dynamic宽度的正方形?

我有一个与ImageViews里面的GridView。 我每行有3个。 我可以使用WRAP_CONTENT和scaleType = CENTER_CROP正确设置宽度,但是我不知道如何将ImageView的大小设置为正方形。 这是我到现在为止所做的,除了高度,这是“静态”:

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

我正在做一个适配器。

最好的select是自己ImageView ,覆盖度量传递:

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

另一个答案正常工作。 这只是bertucci解决scheme的一个扩展,使得ImageView的方形宽度和高度相对于xml充气布局。

创build一个类,像这样说一个扩展ImageView的SquareImageView,

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

现在,在你的XML做到这一点,

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

如果你不需要在程序中dynamic创build一个ImageView,而是用xml来修复,那么这个实现将会很有帮助。

更简单:

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

几个以前的答案是完全足够的。 我只是在@Andro Selva和@ a.bertucci的解决scheme中添加一个小的优化:

这是一个微小的优化,但检查宽度和高度是不同的可以防止另一个测量通过。

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

在这里,所有的onMeasure都不需要调用它的超类。 这是我的实现

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