ImageView是一个动态宽度的正方形?

And*_*rea 71 size android dynamic imageview

我有一个带有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));
Run Code Online (Sandbox Code Playgroud)

我在适配器里面做的.

a.b*_*cci 165

最好的选择是ImageView自己子类化,覆盖度量传递:

public class SquareImageView  extends ImageView {

  ...

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

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

  ...

}
Run Code Online (Sandbox Code Playgroud)

  • android:adjustViewBounds ="true"android:scaleType ="centerCrop"@Waza_Be (2认同)
  • 不应该将其设置为最小值(宽度,高度)吗? (2认同)

And*_*lva 97

另一个答案很好.这只是bertucci解决方案的一个扩展,它使得ImageView具有相对于xml膨胀布局的方形宽度和高度.

创建一个类,比如像这样扩展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);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,在你的xml中这样做,

        <com.packagepath.tothis.SquareImageView
            android:id="@+id/Imageview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
Run Code Online (Sandbox Code Playgroud)

如果你需要在程序中动态创建ImageView,而不是在xml中修复,那么这个实现将很有帮助.


mix*_*xel 26

更简单:

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


Cha*_*ejo 11

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

这是一个很小的优化,但检查宽度和高度是否不同可能会阻止另一次测量通过.

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

}
Run Code Online (Sandbox Code Playgroud)