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 richten Sie Bildansicht unten, füllen Ihre Breite und Höhe ein, und halten Sie das Seitenverhältnis?

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).

Schreibe einen Kommentar