Wie richten Sie Bildansicht unten, füllen Ihre Breite und Höhe ein, und halten Sie das Seitenverhältnis?
Hintergrund
Gibt es verschiedene XML-Attribute für die Bildansicht zu skalieren, seinen Inhalt , und den verschiedenen layout-Ansichten, die es zu sichten und Ihre Größen.
Aber ich kann nicht herausfinden, wie groß eine Bildansicht schön auf manchen Fällen.
Ein Beispiel ist die Bildansicht auf dem Boden (ein frameLayout, zum Beispiel) , Maßstab seiner Breite so viel wie möglich, und halten immer noch das Seitenverhältnis (ohne beschneiden).
Das problem
Keiner der Kombinationen, die ich gefunden habe gearbeitet, einschließlich der verschiedenen ScaleType Werte, adjustViewBounds, Schwerkraft ,...
Es scheint, als ob Bildansicht findet einige wichtige ScaleType Werte.
, Was ich versucht habe
So weit, die einzige Lösung, die für mich gearbeitet hat, ist die Einstellung der Bildansicht unten (mit der Schwerkraft gesetzt, um Boden-und center-horizontal), und verwenden Sie code, ähnlich wie dieses:
final ImageView logoBackgroundImageView = ...;
final LayoutParams layoutParams = logoBackgroundImageView.getLayoutParams();
final Options bitmapOptions = ImageService.getBitmapOptions(getResources(), R.drawable.splash_logo);
final int screenWidth = getResources().getDisplayMetrics().widthPixels;
layoutParams.height = bitmapOptions.outHeight * screenWidth / bitmapOptions.outWidth;
logoBackgroundImageView.setLayoutParams(layoutParams);
Dies funktioniert in der Regel , und braucht nicht viel verpasst, um es für sich arbeiten, wenn es nicht in Vollbild, aber ich Frage mich, ob es einen einfacheren Weg.
Es funktioniert möglicherweise nicht bei der Höhe wird zu groß sein, so möchten Sie vielleicht, um es zu ändern, so dass, wenn das passiert, legen Sie die Breite zu verkleinern, damit alles passte in den container.
Die Frage
Gibt es eine Lösung oder eine Bibliothek, die es behebt verschiedene Probleme mit der Bildansicht ?
EDIT: hier ein Beispiel-Bild, was ich versuche zu tun, dieses mal, innerhalb eines vertikalen LinearLayout, die Grenzen der Bildansicht in der Mitte, zwischen 2 anderen Ansichten:
Wie Sie sehen können, auf einige (oder alle?) die previews, das mittlere Bild ist rechts ausgerichtet, anstatt sich auf der Mitte (horizontal).
Ich soll es nehmen alle Platz, den es bekommen habe und Waage (halten Seitenverhältnis), und doch werden ausgerichtet, um den unteren Raum, der es hat.
hier ist eine Beispiel-XML-eine Kombination, die ich versucht habe :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF339AE2">
<View
android:layout_width="match_parent"
android:id="@+id/topView"
android:layout_alignParentTop="true"
android:layout_height="100dp"
android:background="#FF00ff00"
/>
<FrameLayout
android:layout_below="@+id/topView"
android:layout_width="match_parent"
android:layout_centerHorizontal="true"
android:layout_above="@+id/bottomView"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:background="#FFffff00"
android:layout_gravity="bottom|center_horizontal"
android:src="@android:drawable/sym_def_app_icon"
android:scaleType="fitEnd"
android:layout_height="match_parent"
/>
</FrameLayout>
<View
android:background="#FFff0000"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:id="@+id/bottomView"
android:layout_width="match_parent"
android:layout_height="100dp"/>
</RelativeLayout>
Wieder, beachten Sie, dass ich habe versucht, mehrere Kombinationen, aber keiner von Ihnen arbeitete, so dass, wenn Sie vorschlagen, etwas zu ändern in der XML, versuchen Sie es bitte zuerst. Beachten Sie auch, dass die oben ist ein POC (um es einfach zu Lesen).
BTW, ist die Problemumgehung ich vorgeschlagen habe funktioniert auf einigen (oder den meisten?) Fällen, aber nicht alle. Sie können feststellen, es einfach durch drehen Ihres Geräts. Vielleicht gibt es einen Weg, es zu beheben, oder erweitern von Bildansicht um die extra-Fall.
- Was über die Bildansicht.ScaleType.FIT_END ?
- ich habe es ausprobiert. es skaliert, wird das Bild auf die am rechten Ende von sich selbst. Ich habe versucht : android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:adjustViewBounds="true" android:scaleType="fitEnd"
- Aber wenn ich die Höhe auf "match_parent", ich bin nicht sicher, was ich sehe. Ist es das, was hast du gemeint?
- dann poste ein Bild, was Sie Sie haben
- OK, ich zeige ein Beispiel, einschließlich code.
- Set android:background="#a00" für Testzwecke, um zu sehen, image-anzeigen, die Grenzen
- OK, ich werde jetzt veröffentlichen einen neuen screenshot und code.
- ich sehe das problem jetzt: fitEnd funktioniert nur, wenn die Breite < Höhe (wenn das Bild ist eine quadratische Form)
- Sie müssten einige benutzerdefinierte matrix Skala wie diese: pastebin.com/vJkqDfrH
- Warum nicht Sie es in eine normale Antwort? Auch haben Sie es versucht? Beachten Sie bitte auch erklären, wie es funktioniert, und vielleicht machen es schöner zu verwenden.
- Ich post nie ungetestete code, zuerst check it out, da bin ich mir nicht sicher, ob das skalieren von Schrift ist, was Sie wirklich wollen, da deine problem Beschreibung ist nicht ganz klar, und ja, es ist nur ein proof-of-concept, müssen Sie zu Polieren
- Was ich möchte ist, dass das Bild selbst würde die Waage, so viel wie möglich, halten Sie das Seitenverhältnis, werden horizontal zentriert, aber auch seine unten gesetzt auf dem unteren Rand der Ansicht. Mit Fit-End-schien alles zu haben, außer es ist nicht horizontal zentriert. Vielleicht hat es andere Probleme, die konnte ich nicht feststellen.
- Hast du meine geschnippelt?
- Nun habe ich es getestet. Es fast geklappt. auf Nexus 9 und Nexus 10, wird nur der untere Teil des Bildes angezeigt (oberer Teil abgeschnitten). tatsächlich, auch auf anderen previews, die ich sehen es wird gekürzt, aber nicht zu viel abgeschnitten wird.
- Natürlich, da Sie möchten, dass die Breite voll skaliert, also wenn der skalierte Höhe größer ist, dass die view die Höhe abgeschnitten werden
- Ich meinte, ohne etwas abschneiden. Alle Inhalte dargestellt werden sollen, wie die Bild versucht, sowohl die Breite und Höhe. Es ist nur ausgerichtet auf den Boden und steht in der Mitte-horizontal. Ich will, dass es zu skalieren, so viel wie möglich, aber nicht abgeschnitten, und auch das Seitenverhältnis beibehalten. Nachdem der leere Raum ist ok, aber das entfernen von Inhalten ist nicht. Das gesamte Bild sollte sichtbar sein.
- so versuchen Sie, diese pastebin.com/CAkuJa9Y
- Dies sieht perfekt aus. Ich könnte falsch sein, aber ich denke, das Bild ist etwas nach rechts. Vielleicht ist es eine optische Täuschung oder einfach nur, wie das Symbol, ich benutze aussieht. Können Sie bitte poste es als Antwort, und versuchen zu erklären, wie es funktioniert und wie? vielleicht würde ich erstellen möchten Derivate dieser netten code, die haben andere Regeln, so ist es wichtig zu verstehen,...
- Seltsam. Ich habe jetzt versucht, was "corsair992" schrieb, und es funktionierte. Sache ist, dass ich sicher war, ich hab es schon... tut mir Leid für diese. Nehmen Sie ein +1 für den Versuch mir zu helfen. Wäre noch schön zu wissen, wie hast du das code. Könnte interessant sein.
- hmm das was ich bekomme picpaste.com/layout-2015-01-30-145729-uiAmRkX8.png, imho ist dies nicht beabsichtigt ist
- Das ist ok, da das Bild quadratisch ist. es behielt seinen Seitenverhältnis skaliert, so viel wie es kann (nach dem Raum, der es hat), blieb auf den unteren Teil von dem, was ihm zur Verfügung zu stellen. Sie können einen hintergrund für das FrameLayout, wenn Sie es wünschen. Tut mir Leid wenn ich nicht so klar. Es ist ein bisschen komisch, dass auf der linken Seite sieht, mehr leeren Raum als die Rechte Seite. Vielleicht ist es wie in deiner Lösung, eine illusion (oder einfach nur, wie das Bild aussieht).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine Kombination von drei Parametern:
Den
adjustViewBounds
Attribut ist erforderlich, daImageView
Maßnahmen selbst zu entsprechen, werden die ursprünglichen Maße des drawable standardmäßig, ohne Rücksicht auf eine Skalierung erfolgt nach der Skala geben.Können Sie benutzerdefinierte
FitWidthAtBottomImageView
um dies zu erreichen-code:durch manuelles ziehen Sie den unteren Rand ausgerichtet-Bild, das Sie wollen.
dies ist ein Beweis dafür-om-Begriff custom Bildansicht, werden Sie brauchen, um hinzuzufügen, fehlende Konstruktoren und durchführen der Matrix-Einstellung
wenn Bildansicht ist Drawable änderungen:
wie es funktioniert kurz gesagt:
erste der Matrix ist festgelegt durch den Aufruf
Matrix.setRectToRect()
mit stf ==Matrix.ScaleToFit.CENTER
, das Ergebnis ist das gleiche wieImageView.ScaleType.FIT_CENTER
dann in der Angleichung des Drawable unten
Matrix.mapPoints()
heißt, er ordnet die Drawable linken/unteren Ecke, und das Ergebnis ist der transformierte Punkt, als würde man in der Bildansichtund schließlich
Matrix.postTranslate()
übersetzt die MAtrix in Y-Achse, um die Bildansicht untenVersuchen Sie es mit
android:scaleType="fitCenter"
Bearbeiten
Hm, ich sah, was du meinst, ist eine weitere option zu haben es
fitEnd
auf dem Porträt von xml und erstellen eine identische xml-layout-Ordner landen (und erstellen, falls erforderlich) mitandroid:scaleType="fitCenter"
die verwendet werden auf Landschaft nurfitCenter
scale Art, mit einer Höhe vonwrap_content
, undadjustViewBounds
eingestellttrue
.adjustViewBounds
Attributtrue
um dieImageView
richtig zu wickeln, um den skaliert angezeigt drawable Dimensionen, statt der original-Abmessungen.fitCenter
hat die Erhaltung der drawable-Seitenverhältnis, aber wie ich bereits im vorherigen Kommentar, die Standard-Verpackung Messung vonImageView
ist die Anpassung des ursprünglichen, nicht skalierten Dimensionen der drawable, so müssen Sie noch dieadjustViewBounds
- Attribut, um eine ordnungsgemäße Messung. Sie haben möglicherweise versucht, es vor, ohne die Höhe zuwrap_content
, in dem Fall würde es keine Wirkung haben. Auch diese Antwort wurde nicht gepostet von mir, und obwohl es grundsätzlich richtig ist, die poster vielleicht möchten Bearbeiten Sie die zusätzlichen Informationen in seiner Antwort.Ich android:scaleType="fitXY" aber es hat mir versucht es so oft, bis das Bild bekommen habe passen die XY von den gesamten Bildschirm,,,,, was ich meine, es ist eine seltsame Fehler in scaleType und fitEnd funktioniert gut, aber Sie brauchen, um es zu löschen und wieder schreiben, bis es an das Ende des Bildschirms, ohne corpping. Bottom line scaleType hat bugs und Fehler, bis er dir das gibt was du brauchst.
Faust von allen, die ich nicht wirklich verstehen, was Sie wirklich wollen, für das ausrichten Bild auf der Unterseite von dem, was ich Las Ihr layout. Mein layout wird das Bild zentrieren und skalieren Sie Sie ändern können, die hohe der Ansicht von unten zu sehen, wie Bild Aussehen wird. Ändern Sie die Höhe von der oberen oder unteren Ansicht die Größe des Bildes wird vergrößert oder verkleinert, hängt von den verfügbaren Platz für die Bildansicht.
Hoffe, dies wird dein problem lösen.