방금 소스 코드를 읽었 ImageView
으며이 스레드에서 서브 클래 싱 솔루션을 사용하지 않고는 기본적으로 불가능합니다. 에서 ImageView.onMeasure
우리는이 라인에 도착 :
// Get the max possible width given our constraints
widthSize = resolveAdjustedSize(w + pleft + pright, mMaxWidth, widthMeasureSpec);
// Get the max possible height given our constraints
heightSize = resolveAdjustedSize(h + ptop + pbottom, mMaxHeight, heightMeasureSpec);
이미지의 크기는 어디 h
이며 패딩입니다.w
p*
그리고:
private int resolveAdjustedSize(int desiredSize, int maxSize,
int measureSpec) {
...
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
/* Parent says we can be as big as we want. Just don't be larger
than max size imposed on ourselves.
*/
result = Math.min(desiredSize, maxSize);
따라서 layout_height="wrap_content"
를 설정 widthSize = w + pleft + pright
하면 최대 너비가 이미지 너비와 같습니다.
즉 , 정확한 크기를 설정하지 않으면 이미지가 확대되지 않습니다 . 나는 이것이 버그라고 생각하지만, 구글이이를 알리거나 고칠 수 있기를 바랍니다. 편집 : 내 말을 먹고 버그 보고서를 제출 했으며 향후 릴리스에서 수정되었다고합니다!
또 다른 해결책
여기에 또 다른 서브 클래스 해결 방법이지만, 당신이 해야한다 (이론, 정말 많이 테스트하지 않았습니다!) 어디서나 그것을 사용할 수 있습니다 ImageView
. 그것을 사용하려면 layout_width="match_parent"
, 및 layout_height="wrap_content"
. 허용되는 솔루션보다 훨씬 더 일반적입니다. 예를 들어 너비에 맞추는 것뿐만 아니라 높이에 맞추기를 할 수 있습니다.
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
// This works around the issue described here: http://stackoverflow.com/a/12675430/265521
public class StretchyImageView extends ImageView
{
public StretchyImageView(Context context)
{
super(context);
}
public StretchyImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public StretchyImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// Call super() so that resolveUri() is called.
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// If there's no drawable we can just use the result from super.
if (getDrawable() == null)
return;
final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int w = getDrawable().getIntrinsicWidth();
int h = getDrawable().getIntrinsicHeight();
if (w <= 0)
w = 1;
if (h <= 0)
h = 1;
// Desired aspect ratio of the view's contents (not including padding)
float desiredAspect = (float) w / (float) h;
// We are allowed to change the view's width
boolean resizeWidth = widthSpecMode != MeasureSpec.EXACTLY;
// We are allowed to change the view's height
boolean resizeHeight = heightSpecMode != MeasureSpec.EXACTLY;
int pleft = getPaddingLeft();
int pright = getPaddingRight();
int ptop = getPaddingTop();
int pbottom = getPaddingBottom();
// Get the sizes that ImageView decided on.
int widthSize = getMeasuredWidth();
int heightSize = getMeasuredHeight();
if (resizeWidth && !resizeHeight)
{
// Resize the width to the height, maintaining aspect ratio.
int newWidth = (int) (desiredAspect * (heightSize - ptop - pbottom)) + pleft + pright;
setMeasuredDimension(newWidth, heightSize);
}
else if (resizeHeight && !resizeWidth)
{
int newHeight = (int) ((widthSize - pleft - pright) / desiredAspect) + ptop + pbottom;
setMeasuredDimension(widthSize, newHeight);
}
}
}