Ich möchte ein Bild herunterladen (unbekannter Größe, aber immer ungefähr quadratisch) und es so anzeigen, dass es den Bildschirm horizontal ausfüllt und sich vertikal erstreckt, um das Seitenverhältnis des Bildes bei jeder Bildschirmgröße beizubehalten. Hier ist mein (nicht funktionierender) Code. Es streckt das Bild horizontal, aber nicht vertikal, so dass es gequetscht wird ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Antworten:
Ich habe dies mit einer benutzerdefinierten Ansicht erreicht. Setzen Sie layout_width = "fill_parent" und layout_height = "wrap_content" und zeigen Sie auf das entsprechende Zeichenobjekt:
quelle
Am Ende habe ich die Dimensionen manuell generiert, was großartig funktioniert:
quelle
Ich habe gerade den Quellcode für gelesen
ImageView
und es ist im Grunde unmöglich, ohne die Unterklassenlösungen in diesem Thread zu verwenden. In kommenImageView.onMeasure
wir zu diesen Zeilen:Wo
h
undw
sind die Abmessungen des Bildes undp*
ist die Polsterung.Und dann:
Wenn Sie also eine
layout_height="wrap_content"
haben, wird diese festgelegtwidthSize = 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 Sielayout_width="match_parent"
undlayout_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.quelle
Das Setzen von adjustViewBounds auf true und das Verwenden einer LinearLayout-Ansichtsgruppe hat bei mir sehr gut funktioniert. Sie müssen keine Unterklassen erstellen oder nach Gerätemetriken fragen:
quelle
Ich habe mit diesem Problem in der einen oder anderen Form für AGES zu kämpfen, danke, danke, danke ... :)
Ich wollte nur darauf hinweisen, dass Sie eine verallgemeinerbare Lösung aus dem, was Bob Lee getan hat, erhalten können, indem Sie einfach View erweitern und onMeasure überschreiben. Auf diese Weise können Sie dies mit jedem gewünschten Zeichen verwenden, und es wird nicht beschädigt, wenn kein Bild vorhanden ist:
quelle
In einigen Fällen löst diese Zauberformel das Problem auf wunderbare Weise.
Für alle, die Probleme damit haben, von einer anderen Plattform zu kommen, wird die Option "Größe und Form passen" in Android wunderbar gehandhabt, ist aber schwer zu finden.
Sie möchten normalerweise diese Kombination:
Dann ist es automatisch und erstaunlich.
Wenn Sie ein iOS-Entwickler sind, ist es absolut erstaunlich, wie einfach Sie in Android "total dynamische Zellenhöhen" in einer Tabellenansicht erstellen können. Ähm, ich meine ListView. Genießen.
quelle
Ich habe es geschafft, dies nur mit diesem XML-Code zu erreichen. Es kann vorkommen, dass Eclipse die Höhe nicht rendert, um zu zeigen, dass sie sich entsprechend ausdehnt. Wenn Sie dies jedoch tatsächlich auf einem Gerät ausführen, wird es ordnungsgemäß gerendert und liefert das gewünschte Ergebnis. (Na zumindest für mich)
quelle
src
und die ImageView wurde proportional.Ich habe es mit diesen Werten in einem LinearLayout gemacht:
quelle
Jeder macht das programmgesteuert, also dachte ich, diese Antwort würde perfekt hierher passen. Dieser Code funktionierte für meine in der XML. Ich denke noch NICHT über das Verhältnis nach, wollte aber trotzdem diese Antwort platzieren, wenn es jemandem helfen würde.
Prost..
quelle
Eine sehr einfache Lösung besteht darin, nur die von bereitgestellten Funktionen zu verwenden
RelativeLayout
.Hier ist die XML, die es mit Standard-Android ermöglicht
Views
:Der Trick besteht darin, dass Sie festlegen
ImageView
, dass der Bildschirm ausgefüllt wird, er sich jedoch über den anderen Layouts befinden muss. Auf diese Weise erreichen Sie alles, was Sie brauchen.quelle
Es ist einfach zu setzen
adjustViewBounds="true"
undscaleType="fitCenter"
in der XML-Datei für die ImageView!Hinweis:
layout_width
ist auf eingestelltmatch_parent
quelle
Sie setzen den ScaleType auf ScaleType.FIT_XY. Laut den Javadocs wird das Bild dadurch auf den gesamten Bereich gestreckt und bei Bedarf das Seitenverhältnis geändert . Das würde das Verhalten erklären, das Sie sehen.
Um das gewünschte Verhalten zu erzielen ... FIT_CENTER, FIT_START oder FIT_END sind nahe beieinander. Wenn das Bild jedoch schmaler als hoch ist, wird die Breite nicht ausgefüllt. Sie könnten sich jedoch ansehen, wie diese implementiert werden, und Sie sollten wahrscheinlich in der Lage sein, herauszufinden, wie Sie sie für Ihren Zweck anpassen können.
quelle
ScaleType.CENTER_CROP macht das, was Sie wollen: Dehnen Sie es auf die volle Breite und skalieren Sie die Höhe entsprechend. Wenn die skalierte Höhe die Bildschirmgrenzen überschreitet, wird das Bild zugeschnitten.
quelle
Schauen Sie, es gibt eine weitaus einfachere Lösung für Ihr Problem:
quelle
Sie können mein StretchableImageView verwenden , um das Seitenverhältnis (nach Breite oder Höhe) abhängig von der Breite und Höhe des Zeichens beizubehalten:
quelle
Für mich hat der Android: scaleType = "centerCrop" mein Problem nicht gelöst. Es hat das Bild tatsächlich viel mehr erweitert. Also habe ich es mit Android versucht: scaleType = "fitXY" und es hat hervorragend funktioniert.
quelle
Dies funktioniert gut gemäß meiner Anforderung
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
quelle