Hintergrundbild richtig positionieren. Wie ?

  • Antworten:9
Sascha D.
  • Forum-Beiträge: 74

07.05.2019, 22:31:24 via Website

Hallo Leute, ich habe ein Problem mit der Grafik XML.
Wenn ich ein Hintergrundbild auf die Activity lege. Streckt der kompletten auf, was falsch ist. Nehme ich ein Image und mache scale Center, streckt der zwar richtig, aber an der falschen Stelle. Ich kann zwar sagen scrollx, dann stimmt es auf meinem S8, aber auf anderen nicht. Man könnte ja ein bitmap programmieren, aber wie geht das im Editor selbst. Also was ich brauche ist.
Setze Hintergrundbild auf 0.0
Strecke bis zur unteren Auflösung des Handys und strecke nach rechts 1:1 mit ohne verzerren. Wie geht das ?

Kommentieren
swa00
  • Forum-Beiträge: 3.704

07.05.2019, 23:04:31 via Website

Hallo Sascha,

Strecke bis zur unteren Auflösung des Handys und strecke nach rechts 1:1 mit ohne verzerren.

Zur Runtime :
Du musst dir zuerst die Ratio vom Bitmap und dann die Ratio des Display ermitteln und dann manuell anpassen . Sonst bekommst du die Verzerrung nie heraus .

Editor :
Es seit denn du macht im Editor auf fit , dann ist es verzerrt oder mit scale , dann mit ggf. mit Rändern behaftet. Mit dem Editor bekommst du niemals die eierlegende Wollmilchsau hin.

Das Ganze soll ja schließlich auf verschiedenen Devices laufen.

Anmerkung :
Man nimmt auch als Background niemals ein Bitmap , man rendert was Hübsches zur Runtime.
Alleine schon aus Resourdengründen. (z.b. Gradient)

— geändert am 07.05.2019, 23:07:59

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

08.05.2019, 11:47:57 via Website

Hallo Sascha,

wie genau soll denn das fertige Bild im Hintergrund aussehen?
Wenn du anfängst mit "Setze Bild auf 0.0" und "Strecke Bild auf untere Auflösung des Handys", deute ich daraus, dass das Bild am linken Rand bleiben soll und die Höhe des Bildschirms haben soll, egal wie breit dieser ist.
Solange das Hintergrundbild genau das gleiche Seitenverhältnis hat, wie der Bildschirm, würde das funktionieren. Aber bei allen Anderen würde doch entweder ein Teil des Bildschirms kein Hintergrundbild mehr haben oder ein Teil des Hintergrundbildes vom Rand abgeschnitten werden.

Kommt mir beides nicht so richtig logisch vor für ein Hintergrundbild. (thinking)

— geändert am 08.05.2019, 11:49:32

Hilfreich?
Kommentieren
Sascha D.
  • Forum-Beiträge: 74

08.05.2019, 21:56:14 via Website

Um es so zu beschreiben. Mein Hintergrundbild ist eher links und läuft nach rechts schwarz aus.
Sprich, es soll z.B. beim Handy links oben, bis links unten alles füllen und sagen wir rechts bleibt ein 3cm schwarzer Rand. Bei Tablet dito, aber dann wegen mir mit 6cm+ Rand, je nach Tebletbreite.
Aber das Bild darf eben nicht verzerrt sein. Daher wollte ich eben wissen ob es da einen XML Befehl gibt ala

android:layout_setzebild_x=0
android:layout_setzebild_y=0
android:layout_stretch=to_bottom
android:layout_stretch_ratio:1:1
um es mal grob zu beschreiben

mein code:
android:id="@+id/id_hintergrund"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:scrollX="-150dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:background="#00000000"
android:scaleType="center"

    app:srcCompat="@drawable/startbild" />

setzt mir das Bild zwar auf die richtige Stelle und stretch auch voll auf 1:1, aber das scrollX muss eben anders. Das Problem ist, dass center offenbar immer in der Mitte des Bildschirms aufstreckt.
sprich ich bräuchte in dem Editor einen Befehl ala
android:scrollX=-bildschrirmbreite/2 mit Bildgröße verrechnet
ohne das ich dafür programmcode schreiben muss.

sonst könnte man die Seiten designerei ja gleich lassen und alles per Code programmieren :/

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

09.05.2019, 07:26:00 via Website

Hallo,

android:scrollX=-bildschrirmbreite/2 mit Bildgröße verrechnet
ohne das ich dafür programmcode schreiben muss.

Wie schon oben beschrieben , geht das nicht , also nur zur Runtime zu berechnen.

sonst könnte man die Seiten designerei ja gleich lassen und alles per Code programmieren :/

Dafür ist es auch nicht gemacht ....... Das ist lediglich ein Layoutdesigner , kein Imagerendering.
(Zwei völlig verschiedene Aufgaben und Techniken)

Auch hier gilt wie bei einem Loch in der Wand : Der Dübel muss zum Loch und der Schraube passen .
Sprich : Da es unmöglich ist, ein universelles Bitmap für alle Screen Dimensionen und der Ratio mitzuliefern , muss du es programmtechnisch berechnen , ausschneiden , reduzieren.

Das ist nicht nur bei Android so , sondern gängige Technik auf allen Plattformen.

Anmerkung :

android:scrollX="-150dp" 

wird nur auf einem Device-Typ funktionieren, ist auch nicht konform.

— geändert am 09.05.2019, 07:53:07

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Gelöschter AccountJokel
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

09.05.2019, 07:51:01 via Website

Ich finde auch, dass doch nichts dagegen spricht, dass im Code zu lösen, wenn man dadurch dann eine richtige Lösung bekommt. Der Layouteditor ist für sowas halt nicht gedacht. Alles was du da machst wäre nur tricksen.

Aber trotzdem der Vollständigkeit halber:
Wenn ich dich jetzt richtig verstehe, soll dein Farbverlauf immer am linken Bildschirmrand anfangen und die komplette Bildschirmhöhe abdecken. Die Breite von diesem Hintergrundbild soll sich der Höhe so anpassen, solange sich das Seitenverhältnis nicht verändert, auch wenn das bedeutet, dass der rechte Teil vom Bildschirm kein Hintergrundbild mehr hat.
Falls du ein ConstraintLayout verwendest (bin nicht sicher, ob das auch bei anderen geht), dann kannst du da eine ImageView mit deinem Hintergrundbild reinlegen und sie am oberen, unteren und linken Bildschirmrand anbinden. Die layout_height stellst du auf match_constraint und die layout_width auf wrap_content. Dann gibt es beim ImageView noch die Eigentschaft adjustViewBounds, die du auf true stellen musst.
Dann würde es so Aussehen, wie du es dir vorstellt. Problem ist hier aber, dass es nur gut geht, solange die Breite vom Bildschirm groß genug ist, dass ein Rand übrig bleibt. Sobald dein Hintergrundbild breiter werden würde, als der Bildschirm, würde er das wieder anpassen und das Bild verzerren.

Hilfreich?
swa00
Kommentieren
swa00
  • Forum-Beiträge: 3.704

09.05.2019, 07:55:28 via Website

@Robert S.

Wenn ich dich jetzt richtig verstehe, soll dein Farbverlauf immer am linken Bildschirmrand anfangen und die komplette Bildschirmhöhe abdecken

Ich bin mir die ganze Zeit auch nicht sicher , was er eigentlich will.
Will er nur einen Gradienten ? Irgendwie kommt das zwischen den Zeilen heraus :-)

@Sascha D.
Wenn das so ist ( gradient) dann schlichtweg zur Runtime drei Zeilen

 GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,new int[] {0xFF009795,0xFF004494});
                gd.setCornerRadius(0f);
                view.setBackground(gd);

— geändert am 09.05.2019, 07:58:56

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Sascha D.
  • Forum-Beiträge: 74

09.05.2019, 21:26:06 via Website

Ich sage mal danke. Der Tipp den ich offenbar gesucht habe ist, dass man das Bild eben schmaler machen muss als das schmalste Display. Wenn ich jetzt verschiedene Handys und Tablets simuliere, macht der genau das was er soll. Finde ich trotzdem unlogisch, dass er nicht über die Kanten malen kann und trotzdem einfach einstreckt. Andere Variante wäre der Kompromiss Tennisplatz von oben. Man nimmt center strecken und sieht sagen wir auch einem Tablet eben an den Seiten mehr Zuschauerrang als auf einem smartphone. Aber für das was ich noch vor habe, ala Felder die immer bezogen zu dem Hintergrundbild sind, werde ich um coden nicht rum kommen. Das scheint nicht zu gehen ala setze Textfeld auf x,y und mit Auflösungen strecken setzt der automatisch an die richtige Stelle.

Hilfreich?
Kommentieren
Valerian Teritron
  • Forum-Beiträge: 6

11.05.2019, 16:07:20 via Website

Da ich bisher überwiegend Spiele programmiert habe, mache ich alle Zeichen-Operationen selbst in der onDraw() Methode auf den Canvas. Da hat man dann alle Freiheit sowas auszuprogrammieren, wie ein Image/Bild eingepasst (scaliert, gedreht, gestaucht, ...) werden soll.

Ich gehe aber mal davon aus, dass in deiner App vermutlich Buttons und Eingabe-Felder über dem Hintergrund-Bild dargestellt werden. Somit ist diese Art den Bildschirm zu füllen ungeeignet.

Hilfreich?
Kommentieren
Sascha D.
  • Forum-Beiträge: 74

12.05.2019, 09:39:32 via Website

Ja, es werden erstmal nur Buttons und Eingabefelder. Hatte vor Jahren mal mit JavaMe programmiert und dachte das XML Zeug nimmt einem mehr Arbeit ab. Aber bis ich mich da durch gefunden habe, was geht oder nicht geht, habe ich auch schnell mal die onDraw gefüllt bzw. den Button per Code positioniert.

Hilfreich?
Kommentieren