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