Android动态适配图片宽高,android-ImageView是具有动态宽度的正方形?

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

我正在适配器内做。

8个解决方案

158 votes

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

public class SquareImageView extends ImageView {

...

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int width = getMeasuredWidth();

setMeasuredDimension(width, width);

}

...

}

a.bertucci answered 2019-09-29T22:57:16Z

93 votes

另一个答案很好。 这只是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中执行此操作,

android:id="@+id/Imageview"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

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

Andro Selva answered 2019-09-29T22:57:59Z

25 votes

更简单:

public class SquareImageView extends ImageView {

...

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, widthMeasureSpec);

}

}

mixel answered 2019-09-29T22:58:22Z

11 votes

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

}

}

}

Chantell Osejo answered 2019-09-29T22:58:52Z

2 votes

指定宽度的squareImageView:

public class SquareImageViewByWidth extends AppCompatImageView {

public SquareImageViewByWidth(Context context) {

super(context);

}

public SquareImageViewByWidth(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SquareImageViewByWidth(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int width= getMeasuredWidth();

setMeasuredDimension(width, width);

}

...

}

指定高度的squareImageView:

public class SquareImageViewByHeight extends AppCompatImageView {

public SquareImageViewByHeight(Context context) {

super(context);

}

public SquareImageViewByHeight(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SquareImageViewByHeight(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int height = getMeasuredHeight();

setMeasuredDimension(height, height);

}

...

}

最小尺寸的squareImageView:

public class SquareImageViewByMin extends AppCompatImageView {

public SquareImageViewByHeight(Context context) {

super(context);

}

public SquareImageViewByHeight(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SquareImageViewByHeight(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int width = MeasureSpec.getSize(widthMeasureSpec);

int height = MeasureSpec.getSize(heightMeasureSpec);

int minSize = Math.min(width, height);

setMeasuredDimension(minSize, minSize);

}

...

}

Misagh answered 2019-09-29T22:59:28Z

1 votes

对于那些寻找Kotlin解决方案的人:

class SquareImageView @JvmOverloads constructor(

context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0

) : ImageView(context, attrs, defStyleAttr, defStyleRes){

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) = super.onMeasure(widthMeasureSpec, widthMeasureSpec)

}

Marthijn Bontekoning answered 2019-09-29T22:59:51Z

1 votes

如果有人希望视图不为正方形,而是按比例调整高度(例如16/9或1/3),则可以这样做:

@Override

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

heightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth()/3, MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

John answered 2019-09-29T23:00:15Z

-1 votes

在这里,所有不必要的调用它的超类为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);

}

Sourav Bagchi answered 2019-09-29T23:00:38Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值