为了账号安全,请及时绑定邮箱和手机立即绑定

ImageView是具有动态宽度的正方形吗?

ImageView是具有动态宽度的正方形吗?

慕妹3146593 2019-11-28 13:58:34
我有一个带有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));我正在适配器内做。
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

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


public class SquareImageView  extends ImageView {


  ...


  @Override

  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);


    int width = getMeasuredWidth();

    setMeasuredDimension(width, width);

  }


  ...


}


查看完整回答
反对 回复 2019-11-28
?
九州编程

TA贡献1785条经验 获得超4个赞

另一个答案很好。这只是bertucci解决方案的扩展,以使ImageView相对于xml膨胀版式具有正方形的宽度和高度。


创建一个类,说一个SquareImageView这样扩展ImageView,


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" />

如果您需要不在程序中动态创建ImageView而不是在xml中进行固定,那么此实现将非常有用。


查看完整回答
反对 回复 2019-11-28
?
莫回无

TA贡献1865条经验 获得超7个赞

前面的几个答案就足够了。我只是在这里为@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);

        }

    }


}


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 767 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信