Einstellung der Bildansicht ScaleType "center" nicht so funktioniert, wie ich es erwarten
Habe ich Folgendes layout für meine ImageView
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/imageview_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="fitCenter" />
(...)
</LinearLayout>
Diese 48dp
gleich 36px 48px und 72px in ldpi
, mdpi
und hdpi
beziehungsweise. Alle Bilder, die verwendet werden in diesem ImageView
sind grundsätzlich Symbole und ich habe im web gefunden, was ich möchte für meine app (Kostenlose Lizenz). Aber leider kommt es nicht mit Bildern größer als 48px und mit verschiedenen Bildern aus der Frage. Also brauche ich eine neue Lösung...
Nun muss ich 36px und 48px Bilder in der ldpi
und mdpi
Ordner, beziehungsweise. Aber ich habe Probleme mit hdpi
. Was möchte ich für Geräte laufen auf hdpi
ist für Sie die mdpi
Bild (das größere) und verwenden Sie es, wie es ist, ohne zu skalieren. Im Grunde, die ImageView
für hdpi
ist 72px, so will ich, das 48px Bild zu sein, innerhalb des 72px, in der Mitte, - ohne Skalierung. Dafür habe ich einfach versucht zu ändern scaleType
im ImageView
oben nur center
, aber das Bild wird skaliert sowieso.
Meine entscheidende Frage hier ist, was ist der richtige Weg, um das problem zu beheben, die oben beschrieben? Wie kann ich ldpi
und mdpi
Bilder verwendet werden, die in Ihren jeweiligen dichten, haben aber Geräte mit hdpi
pick-up die größten verfügbaren Bilder aus (das ist die mdpi
) und verhindern Sie die Skalierung, nur passend das Bild in der Mitte des ImageView
?
EDIT:
Ich beantwortete diese Frage selbst, aber es könnte die Antwort, die anderen hierher zu kommen suchen. Aber ich mache einen Einblick auf das, was wirklich passiert und das zugrunde liegende problem. Bitte nehmen Sie sich einen Blick und bieten einen workaround/fix, wenn Sie können. Ich wage es 🙂
Ja, habe versucht, die meisten logischen Möglichkeiten. Nichts hat funktioniert 🙁
Darf ich Fragen, warum brauchen Sie diese? In der Regel wollen die Leute als auf einem normalen Bildschirm, fünf-64dp-Symbole sollten immer besetzen ganze Bildschirmbreite (die 320dp), sollten immer gleich Aussehen, egal welches Gerät-Auflösung, einschließlich Symbole Seiten immer berühren (mit dem optional device-independent-Polsterung)
Ich verstehe nicht, Ihre Frage...
Ich war mit einer Bibliothek zu tun, es Einschubtechnik(um den hintergrund rund) für mein Projekt arbeiten, aber als ich es geändert Bildansicht es funktionierte perfekt!
InformationsquelleAutor Ricardo Amaral | 2011-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage erweist sich eine nicht-Frage, und ich entschuldige mich für jeden, der gründet, in der Hoffnung die Antwort akzeptiert werden, was Sie suchen, wenn es nicht.
Deutlich zu machen,
scaleType=centerInside
wie erwartet funktioniert. Das ist, wenn Sie ein Bild kleiner als dieImageView
selbst, als das Bild nicht skaliert werden, um die Grenzen desImageView
bleibt es in der Mitte und nicht skaliert.Aber für die oben genannten arbeiten, wie erwartet, die drawable gelegt werden muss, in der
nodpi
Ordner. Ich verstehe, dass dies ist nicht immer akzeptabel. Also, wenn das drawable gelegt werden muss, zu einem der Dichte-Ordner anstelle dernodpi
Ordner, diescaleType
Attribut funktioniert nur in bestimmten Situationen., Wenn es funktioniert:
Xdpi
Dichte undes ist ein drawable in der
Xdpi
Dichte Ordner (hierX
bedeutet,l
,m
,h
oder sogarxh
).zum Beispiel, mit
hdpi
Dichte, aber es ist nicht eine drawable in derhdpi
Ordner und das system wählt die alternative drawable aus demnodpi
Ordner (es ist nicht immer bekannt, welche Ordner es sich Holenaus).
, Wenn es nicht funktioniert:
hdpi
Dichte, aber es ist nicht eine drawable in der
hdpi
Ordner und diesystem wählt die alternative drawable aus sonstigen von der Dichte
Ordner (nicht die
nodpi
Ordner), die drawable wird skaliert auf dieImageView
Grenzen und diescaleType
Attribut nicht tunnichts.
Im Fazit, es gibt keine "richtige" Antwort auf meine Frage, es hängt wirklich davon ab, was Sie versuchen zu erreichen. Die Antwort meine Frage und zwar, ich brauche nur 2 Sachen zu machen: a) die
ImageView
scaleType
zucenterInside
und b) Doppelte alle drawables aus demmdpi
Ordner in denhdpi
Ordner (wie oben erklärt, diescaleType=centerInside
werden, damit es funktioniert).Natürlich, duplizieren drawables ist nicht optimal, aber ich finde keine andere Lösung und so weit, niemand anderes konnte... Also in der Zeit, ich ' ll markieren Sie diese als akzeptiert.
Was wäre die optimale Antwort/Lösung dann?
Meiner Meinung nach, wenn das Gerät/emulator läuft in
hdpi
und gibt es nicht eine passende drawable in derhdpi
Ordner sollte es sein, Holen die drawable aus demmdpi
Ordner ohne Skalierung, so dass diescaleType
Attribut zu tun es ist Sache. Oder vielleicht die Kraft, das system zu gehen, um dienodpi
- Ordner, wenn es nicht finden eine passende drawable in der jeweiligen Dichte-Ordner, das könnte eine Lösung auch.So, wenn jemand jemals bieten einen workaround/fix für dieses Problem, das wäre die wirkliche richtige Antwort. Wenn es jemals dazu kommt, werde ich ändern der akzeptierten status.
InformationsquelleAutor Ricardo Amaral
Ich löste es auf diese Weise:
InformationsquelleAutor Quintin Balsdon
In meinem Fall habe ich die Einstellung wurde das Bild als
android:background
. wenn ich es alsandroid:src
, es funktionierte!InformationsquelleAutor Rohit Mandiwal
Lassen Sie es aus dem hdpi Ordner, und legen Sie es in ein drawable-nodpi Ordner. Ich bin mir nicht sicher, was die Hierarchie ist (ob die nodpi würde, dann überschreiben Sie die ldpi und mdpi Ordner), aber das wäre mein Erster Versuch.
hdpi
Ordner. Ich habe nur 48px Bilder in dermdpi
Ordner und 36px Bilder in derldpi
Ordner. Ich glaube, das Bild abgeholthdpi
Geräte ist den in denmdpi
Ordner. Das problem ist, dass das image wird skaliert, wenn es nicht sollte, weil ich ausdrücklich gesagt, es nicht zu (scaleType = center
).Versuchen Sie es mit der 48px Bild im nodpi Ordner.
Wenn ich erstellen Sie eine Kopie aller 48px Bilder von der
mdpi
Ordner in dennodpi
Ordner, es funktioniert immer noch nicht. Ich weiß nicht, aus welchem Ordner das Bild in derhdpi
Gerät abgeholt wird, aber es immer noch skaliert, um dieImageView
Größe. WederscaleType=center
oderscaleType=centerInside
arbeiten, wenn Sie beide sollten.Hmm...auch eine schlechte Lösung wäre das hinzufügen android:anydensity="false" in Ihrem manifest, unter
<supports-screens>
. Sie würden dann zu bewältigen haben, alle notwendigen Skalierung selbst. Sind die Bilder groß genug, dass durch das duplizieren der mdpi Bilder in den hdpi Ordner wäre das ein problem?Jetzt habe ich versucht auf verschieben alle 48px Bilder der
nodpi
- Ordner, also sowohl diehdpi
undmdpi
Ordner leer sind und dieldpi
Ordner hat die 36px Bilder. MitscaleType=centerInside
,hdpi
Geräte funktionieren, aber aufmdpi
Geräte, es scheint, die kleinere Bilder (vonldpi
Ordner) verwendet werden und das Bild wird skaliert. Ich ernsthaft nicht verstehen, was Los ist...InformationsquelleAutor kcoppock
Versuchen Sie dies:
Setzen und die Bilder in der Regel in der ldpi/mdpi Ordner.
Obwohl ich nicht empfehlen die Verwendung von pixel-Werte.
ImageView
zu haben 72px (das äquivalent für 48dp aufhdpi
), aber ich will einfach nicht das Bild skaliert werden, um zu passen, die Größe, wenn es passiert, kleiner zu sein (das ist, was diescaleType=center
tun soll). Das ist das problem hier, ich will keine Feste Größen.Dann wickeln Sie die Bildansicht innerhalb
<FrameLayout android:layout_width="48dp" android:layout_height="48dp">
. Wie oft brauchen Sie diese? Ich glaube nicht, dass Bildansicht ist entworfen, um teilweise zu umgehen Dichte-unabhängig ldpi-mdpi, und teilweise nicht in hdpi.Konnte, den Sie Bearbeiten, Ihre Antwort mit einem vollständigen Beispiel, das im letzten Vorschlag bitte?
Bearbeitet. Obwohl Sie dies für alle Symbole ist ein wenig zu viel.
Nicht das, was ich da erwarten, Sie sind noch erzwingen, dass die Bilder nicht größer als 48px und das will ich nicht. Ich will, dass Sie 48px wenn Sie wirklich sind, 48px, aber wenn Sie kleiner sind, möchte ich Sie zu verkleinern, wenn Sie größer sind will ich Sie größer (aber nicht größer als 48dp, 72px in hdpi). Vielleicht bin ich nicht erklären, mich richtig, aber ich bin mir nicht sicher, wie Sie es besser machen. Für das Protokoll, ich habe auch versucht ein ähnliches Beispiel, das FrameLayout Idee, aber ohne die 'max' - Parameter, wird das Bild noch skaliert, um die volle Größe des FrameLayout.
InformationsquelleAutor Daniel Fekete
Versuchen mit
InformationsquelleAutor Badre
Erstellen Sie eine benutzerdefinierte Bildansicht:
Verwenden Sie es einfach als:
InformationsquelleAutor Daniel Fekete