Sadece kaynak kodunu okudum ve ImageView
bu iş parçacığındaki alt sınıflandırma çözümlerini kullanmadan bu temelde imkansız. Gelen ImageView.onMeasure
biz bu satırları olsun:
// 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);
Görüntünün boyutları nerede h
ve nerede ve dolgu.w
p*
Ve sonra:
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);
Eğer var ise bir layout_height="wrap_content"
o ayarlayacaktır widthSize = w + pleft + pright
veya başka bir deyişle, görüntü genişliğine eşittir genişliği maksimum.
Bu, kesin bir boyut belirlemediğiniz sürece görüntülerin ASLA büyütülmeyeceği anlamına gelir . Bunun bir hata olduğunu düşünüyorum, ancak Google'ın bunu fark etmesi veya düzeltmesi için iyi şanslar. Düzenleme: Kendi sözlerimi yiyerek bir hata raporu gönderdim ve gelecekteki bir sürümde düzeltildiğini söylediler!
Başka bir çözüm
İşte başka Subclassed geçici çözüm olmakla birlikte, gereken (teoride, gerçekten çok test etmedim!) Her yere kullanmak mümkün ImageView
. Kullanmak için ayarlayın layout_width="match_parent"
ve layout_height="wrap_content"
. Kabul edilen çözümden çok daha geneldir. Örneğin, yüksekliğe sığdırmanın yanı sıra genişliğe sığdır da yapabilirsiniz.
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);
}
}
}