Ich habe gerade den Quellcode für gelesen ImageViewund es ist im Grunde unmöglich, ohne die Unterklassenlösungen in diesem Thread zu verwenden. In kommen ImageView.onMeasurewir zu diesen Zeilen:
// 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);
Wo hund wsind die Abmessungen des Bildes und p*ist die Polsterung.
Und dann:
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);
Wenn Sie also eine layout_height="wrap_content"haben, wird diese festgelegt widthSize = w + pleft + pright, oder mit anderen Worten, die maximale Breite entspricht der Bildbreite.
Dies bedeutet, dass Bilder NIEMALS vergrößert werden , wenn Sie keine genaue Größe festlegen . Ich halte dies für einen Fehler, aber viel Glück, dass Google ihn zur Kenntnis nimmt oder behebt. Bearbeiten: Als ich meine eigenen Worte aß, reichte ich einen Fehlerbericht ein und sie sagten, dass er in einer zukünftigen Version behoben wurde!
Eine andere Lösung
Hier ist eine weitere Problemumgehung für Unterklassen, aber Sie sollten (theoretisch habe ich es nicht wirklich viel getestet!) In der Lage sein, sie überall dort zu verwenden, wo Sie möchten ImageView. Um es zu verwenden, setzen Sie layout_width="match_parent"und layout_height="wrap_content". Es ist viel allgemeiner als die akzeptierte Lösung. Zum Beispiel können Sie sowohl Höhen- als auch Breitenanpassungen durchführen.
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);
}
}
}