如何设置这两个最大和最小尺寸在Android中的ImageView的 [英] How to set both min and max size for an ImageView in Android
问题描述
我想这样同时指定分钟。宽度/高度和最大。宽/高为ImageView的。图像应进行调整以适合。
I would like so specify both min. width/height and max. width/height for an ImageView. The image should be scaled to fit.
这样做:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="100dp"
android:maxWidth="200dp"
android:minHeight="100dp"
android:maxHeight="200dp"
android:src="@drawable/ic_launcher" />
最小。宽度和高度的执行,因为他们应该,但最大。宽度和高度将被忽略。
the min. width and height perform as they should, but max. width and height are ignored.
如果我设置的android:adjustViewBounds =真:
If I set android:adjustViewBounds="true":
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:minWidth="100dp"
android:maxWidth="200dp"
android:minHeight="100dp"
android:maxHeight="200dp"
android:src="@drawable/ic_launcher" />
比,最大。宽度和高度的执行,因为他们应该,但分。宽度和高度将被忽略。
than, the max. width and height perform as they should, but min. width and height are ignored.
有没有办法兼得?
推荐答案
在最后,我创建了自己的观点,即extands的ImageView和覆盖onMeasure():
In the end, I created my own view that extands ImageView and overwrites onMeasure():
public class ResizingImageView extends ImageView {
private int mMaxWidth;
private int mMaxHeight;
public ResizingImageView(Context context) {
super(context);
}
public ResizingImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ResizingImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setMaxWidth(int maxWidth) {
super.setMaxWidth(maxWidth);
mMaxWidth = maxWidth;
}
@Override
public void setMaxHeight(int maxHeight) {
super.setMaxHeight(maxHeight);
mMaxHeight = maxHeight;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Drawable drawable = getDrawable();
if (drawable != null) {
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
if (wMode == MeasureSpec.EXACTLY || hMode == MeasureSpec.EXACTLY) {
return;
}
// Calculate the most appropriate size for the view. Take into
// account minWidth, minHeight, maxWith, maxHeigh and allowed size
// for the view.
int maxWidth = wMode == MeasureSpec.AT_MOST
? Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth)
: mMaxWidth;
int maxHeight = hMode == MeasureSpec.AT_MOST
? Math.min(MeasureSpec.getSize(heightMeasureSpec), mMaxHeight)
: mMaxHeight;
int dWidth = Helpers.dipsToPixels(drawable.getIntrinsicWidth());
int dHeight = Helpers.dipsToPixels(drawable.getIntrinsicHeight());
float ratio = ((float) dWidth) / dHeight;
int width = Math.min(Math.max(dWidth, getSuggestedMinimumWidth()), maxWidth);
int height = (int) (width / ratio);
height = Math.min(Math.max(height, getSuggestedMinimumHeight()), maxHeight);
width = (int) (height * ratio);
if (width > maxWidth) {
width = maxWidth;
height = (int) (width / ratio);
}
setMeasuredDimension(width, height);
}
}
}
此视图现在可以使用这样的:
This view can now be used like:
<my.package.ResizingImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="100dp"
android:maxWidth="200dp"
android:minHeight="100dp"
android:maxHeight="200dp"
android:src="@drawable/ic_launcher" />
这个工程,我想,但不应该有一个更简单的解决办法吗?
This works as I wanted, but shouldn't there be an easier solution?
这篇关于如何设置这两个最大和最小尺寸在Android中的ImageView的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!