[ANDROID STUDIO] Verzweiflung bei verschiedenen Screensizes in einer speziellen Activity

  • Antworten:15
  • Bentwortet
Samsong
  • Forum-Beiträge: 18

20.01.2021, 14:00:01 via Website

Hallo Leute,

ich muss euch noch einmal stören, aber mein Problem lässt sich einfach nicht lösen.
Auch wenn es dafür unzählige Anleitungen gibt...keine hat funktioneirt.

Es geht um folgendes:

für die App habe ich 20 fast identische Bilder gemacht - diese ändern sich nach je nach Wert immer nur leicht ab. Das spielt aber auch keine Rolle aktuell. Auf was ich hinaus möchte. Um das dynamisch zu machen, ändert sich das Bild im java code mit einem switch case statement. Hierzu die Fragen und Probleme.

  1. Auf meinen 1-2 Test Smartphones sah das gut aus. Die Bilder sind im Format .png, die höhe und breite wird mit "wrap_content" angegeben und es wird lediglich über margin Angaben der Abstand zum Rand festgelegt. Also wie gesagt. Auf meinen Test Smartphones sah das gut aus. Es sind auch unterschiedliche Screensizes gewesen.
    Jetzt aber das Problem. Habe es in Firebase hochgeladen, um die Robotests zu machen und siehe da. Alles hat sich verschoben. Es passt nichts mehr. Nicht nur in der Activity mit den Bildern. Die anderen sahen auch nicht so aus, wie sie sollten.

  2. Also habe ich es mit diversen online Lösungen a la "value" Ordnerstrukturen für verschiedene "sw" Bereiche versucht. hier einmal der Link zu der Github Seite, für diese Lösung.
    Das sah anfangs auch vielversprechend aus. Zumindest passen die anderen Activites jetzt, nur leider diese mit den Bildern nicht.

Alsoooo der nächste Ansatz.
Vielleicht die .png in .svg umwandeln und dann importieren?
Versucht, aber leider nimmt er mir die .xml dateien nicht an, wenn ich sie im java code einfüge. Bekomme da folgenden Fehler:

java.lang.RuntimeException: Unable to start activity ComponentInfo{bla.blabla.Activity}: android.content.res.Resources$NotFoundException: Drawable com.bla.blabla:drawable/bild with resource ID #0x7f0800cb

habe es mit

setImageDrawable(getResources().getDrawable(R.drawable.bild));
setBackgroundRessource(R.drawable.bild));
setBackgroundDrawable(getResources().getDrawable(R.drawable.bild));
setBackground(getResources().getDrawable(R.drawable.bild));
setImageResource(R.drawable.bild);

Bringt das überhaupt was, das Bild im .svg Format zu versuchen?
Versteh die Welt halt echt nicht mehr. Das kann doch nicht so schwer sein oder bin ich zu unfähig dafür?
Wie regelt ihr das, dass es auf allen Smartphones/Tablets gut aussieht?

Falls ihr mehr Daten benötigt, sagt es bitte. Weiß nur leider nicht, was für einen code ich einfügen soll.

Danke schon einmal im Voraus!

— geändert am 20.01.2021, 14:36:14

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 18:43:10 via Website

Hallo
Du hast "centerCrop" im Layout gesetzt eigentlich müsstest du nichts Skralliren wenn du das Drawable im Java tauschst.

centerCrop behält die Seitenverhältnisse bei und passte es in der Mitte der ImageView ein.
Wenn nötig wird es Skraliert oder Gezoomt.

https://developer.android.com/reference/android/widget/ImageView.ScaleType

android:layout_width="wrap_content"
android:layout_height="wrap_content"

würde ich nicht machen benutze entweder match_parent oder eine sinnvolle feste Breite Höhe.
Damit auch klar ist nach was centerCrop arbeiten soll.

Was mir gerade kommt. Wenn man diese spezielle Activity nun für jede Auflösung macht und anpasst, dann sollte es doch klappen? Also Ordnerstruktur
Layout-xhdpi

Ja aber wenn dann für alle Auflösungen.

Ich würde wohl zu einen CostrainLayout greifen und das Prozentual gestalten nicht nach Pixeln.

PS was soll eigentlich der Code wir arbeiten doch mit Bitmaps.

— geändert am 20.01.2021, 19:03:50

Hilfreich?
Rafael K.Samsong
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 14:28:58 via Website

Hallo
Erstmal nur zu dem Thema Bild in svg umwandeln.
Beim umwandeln wirst du einige Verluste an Bilddeteils haben. Kommt auf deine Bilder an ob sich das lohnt.
Bei eine guten deiteilrichen Foto bestimmt nicht. Würde ich nicht machen.

Die anderen Punkte habe ich mir noch nicht angesehen.

Ps. dein Link geht leider nicht.

— geändert am 20.01.2021, 14:32:30

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

20.01.2021, 14:36:40 via Website

Danke mal für Deine schnelle Antwort :)

Ok also bringt das nicht wirklich was, es umzuwandeln? Dachte halt, dass das Sinn macht, da Vektorgrafiken ja frei skalierbar sind, dass es sich so besser anpasst.

Wegen dem Link. Hier der richtige:
https://github.com/intuit/sdp

Habe ihn oben auch geändert. Danke für den Hinweis.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 14:48:36 via Website

Frage welche Gösse Höhe Breite und DPI Auglösung haben deine Bilder?
Wo in welchen Drawable Ordner hast du sie in deinen Projekt gespeichert?
Welcher Auflösung hatte die Handy wo es gut aussah und welche Auflösung hatte die wo es schlecht war?
Wichtig ist auch immer zu wissen welche DPI und Pixel Auflösung das Handy hat.

/drawable
/drawable-ldpi
/drawable-mdpi
/drawable-hdpi
/drawable-xhdpi
/drawable-xxhdpi
/drawable-xxxhdpi

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 15:00:32 via Website

Hallo bei Grafiken so wie in dem link macht das sinn bei Fotos weniger.
Sie in Vektor Grafiken zuwandeln, und dann auch zu zoomen.

Teste es am Pc mit einem schönen Urlaus Foto du wirst den unterschied sehen.

— geändert am 20.01.2021, 15:29:28

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

20.01.2021, 15:53:19 via Website

Frage welche Gösse Höhe Breite und DPI Auglösung haben deine Bilder?

Größe: im Schnitt ca. 600kb
Breite: ~810px
Höhe: ~1080px
Resolution: 72 × 72 ppi

Wo in welchen Drawable Ordner hast du sie in deinen Projekt gespeichert?

Sie sind einfach nur im Drawable Ordner. Also liegt hier wohl der Hund vergraben? Habe keine Ordnerstruktur a la

/drawable
/drawable-ldpi
/drawable-mdpi
/drawable-hdpi
/drawable-xhdpi
/drawable-xxhdpi
/drawable-xxxhdpi

Wenn man das jetzt aber für jede Größe seperat anpasst, dann wird die App ja riesig. Sie hat jetzt schon 30mb mit den 18 Bildern :D

Welcher Auflösung hatte die Handy wo es gut aussah und welche Auflösung hatte die wo es schlecht war?

Auf dem Pixel 2 sah es zB gut aus:
1080 x 1920 pixels, ~441 ppi density

Auf dem Pixel 3 sah es dann bspw schon nicht mehr so aus, wie es sollte:
1080 x 2160 pixels, ~440 ppi density

Bei 1080 x >2200 pixels wird es dann noch schlimmer.

Mal schauen, ob ich das nicht einfach raus nehme, wenn das so "komplex" ist, bzw einfach zu groß wird. Weil dann lädt sich die app ja auch keiner mehr.

Hilfreich?
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

20.01.2021, 16:44:19 via Website

Wie sieht denn dein Layout aus?
Damit es optimal an verschiedene Bildschirme angepasst wird, würde ich die Breite des ImageView auf match_parent setzen und dann im ImageView scaleType="CENTER_CROP".
Dann wird ggf. abgeschnitten, aber der View wird immer ausgefüllt.

Hilfreich?
Samsong
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 17:06:19 via Website

Hallo

Breite: ~810px
Höhe: ~1080px
Resolution: 72 × 72 ppi

Wie kommst du auf die 72x72 ppi ?
Interessant ist die DPI im bild die auch in den Png mit gespeichert ist.

Interesannt ist auch welche Methode du zum Skralieren zb im XML oder in Java du benutzt.

LDPI: Portrait: 200 X 320px x 0.75
MDPI: Portrait: 320 X 480px x 1.0 (base denstiy)
HDPI: Portrait: 480 X 800px x 1.5
XHDPI: Portrait: 720 X 1280px x 2.0
XXHDPI: Portrait: 960 X 1600px x 3.0
XXXHDPI: Portrait: 1440 x 2560px x 4.0

ldpi Resources for low-density (ldpi) screens (~120dpi).
mdpi Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)
hdpi Resources for high-density (hdpi) screens (~240dpi).
xhdpi Resources for extra-high-density (xhdpi) screens (~320dpi).
xxhdpi Resources for extra-extra-high-density (xxhdpi) screens (~480dpi).
xxxhdpi Resources for extra-extra-extra-high-density (xxxhdpi) uses (~640dpi).

Dein Bild hat dem Pixeln zur folge eine DPI von etwa 480 was aber wirklich in der Png Datei eingetragen ist kannst nur du prüfen.

Wichtig bei der ganzen Sache ist auch wie du Skralierst ob du da auch das Seitenverhältnis beibehältst oder nicht.
Auch wichtig ist wie du das Layout machst ob du da auch das ImageView entsprechend der Bildschirm Auflösung anpasst.

— geändert am 20.01.2021, 17:22:24

Hilfreich?
Samsong
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 17:19:56 via Website

PS dein Pixel 3 hat zwar fast die gleiche Auflösung aber ein anderes Seitenverhltnis somit werden die Bilder gestaucht oder gesteckt. Das kommt nun wider auf deine Skalierungs Methode an. Was du da benutzt.

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

20.01.2021, 18:01:43 via Website

Hey,
das Layout sieht so aus:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
tools:context=".Activity">

<ImageView
    android:id="@+id/background"
    style="@style/BackGroundImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/_60sdp"
    android:layout_marginEnd="@dimen/_10sdp"
    android:layout_marginStart="@dimen/_10sdp"
    android:layout_marginBottom="@dimen/_70sdp"
    android:scaleType="centerCrop"
    android:contentDescription="@string/content"/>

<GridView
        android:id="@+id/simpleGridView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/_35sdp"
        android:layout_marginTop="@dimen/_28sdp"
        android:layout_marginRight="@dimen/_35sdp"
        android:background="@android:color/transparent"
        android:numColumns="4" />
   </RelativeLayout>

Zum Verständnis. Habe eine GridView, die über dem ImageView liegt. Deswegen der Style und hier ist noch der code zum Style:

<style name="BackGroundImageView">
    <item name="android:alpha">1</item>
</style>

Wobei der eher unwichtig in dem Zusammenhang ist. Ist übrigens ein Code aus dem Internet - dieser funktioniert auch wunderbar soweit.

Also das mit dem centercrop hatte ich schon im Code, aber leider funktioniert es da nicht.

Was mir gerade kommt. Wenn man diese spezielle Activity nun für jede Auflösung macht und anpasst, dann sollte es doch klappen? Also Ordnerstruktur
Layout-xhdpi
usw
Dann kann ich dort jeweils die Höhe und Breite des Bildes anpassen. Dann ist halt mehr Platz bei höheren Bildschirmen, aber es würde immerhin passen. Oder habe ich da einen Denkfehler drin?

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

20.01.2021, 18:05:52 via Website

Hey,

Wie kommst du auf die 72x72 ppi ?

Das stand in gimp bei den image properties. Habe da leider keine DPI gefunden. Auch nicht in den Metadaten der png Datei (habe die Metadaten gelöscht. Bin bisschen eigen was Datenschutz angeht)

Interesannt ist auch welche Methode du zum Skralieren zb im XML oder in Java du benutzt.

Also zum Skalieren nutze ich eigentlich nur das "Plugin" aus dem Github link. Dort ist in der build.gradle Datei diese Klasse:

public class SDPFactory extends DefaultTask {

@Input
String unit = "dp"
@Input
double positiveMax = 600
@Input
double negativeMax = 60

@TaskAction
def create() {
    String resFolder =  project.getProjectDir().getPath() + "/src/main/res/";
    for(double dimen = 300; dimen <= 800 ; dimen = dimen + 30){
        String folder = resFolder + "values-sw" + (int)dimen + "dp";
        String fileName = folder + "/positive_sdps.xml";
        new File(folder).mkdir();
        new File(fileName).createNewFile();
        PrintWriter printWriter = new PrintWriter(fileName);
        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        printWriter.println("<resources>");
        for(int i=1; i<=positiveMax; i++){
            double ratio = i/300d;
            double sdp = ratio*dimen;
            printWriter.printf("\t<dimen name=\"_%dsdp\">%.2f" + unit + "</dimen>\r\n",i,sdp);
        }
        printWriter.println("</resources>");
        printWriter.close();
    }
    for(double dimen = 300; dimen <= 800; dimen = dimen + 30){
        String folder = resFolder + "values-sw" + (int)dimen + "dp";
        String fileName = folder + "/negative_sdps.xml";
        new File(folder).mkdir();
        new File(fileName).createNewFile();
        PrintWriter printWriter = new PrintWriter(fileName);
        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        printWriter.println("<resources>");
        for(int i=1;i<=negativeMax;i++){
            double ratio = i/300d;
            double sdp = ratio*dimen;
            printWriter.printf("\t<dimen name=\"_minus%dsdp\">%.2f" + unit + "</dimen>\r\n",i,-sdp);
        }
        printWriter.println("</resources>");
        printWriter.close();
    }
}

}

task createSDP(type: SDPFactory) {

}

//uncomment next line to edit values
//preBuild.dependsOn createSDP

createSDP{
unit = "dp"//change to "sp" if needed
positiveMax = 600//change to 600 or any other value if needed
negativeMax = 60//change to 600 or any other value if needed
}

und dann halt noch die ganzen value Ordner.
Hoffentlich war das die Antwort auf deine Frage mit der Skalierbarkeit :?

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 18:43:10 via Website

Hallo
Du hast "centerCrop" im Layout gesetzt eigentlich müsstest du nichts Skralliren wenn du das Drawable im Java tauschst.

centerCrop behält die Seitenverhältnisse bei und passte es in der Mitte der ImageView ein.
Wenn nötig wird es Skraliert oder Gezoomt.

https://developer.android.com/reference/android/widget/ImageView.ScaleType

android:layout_width="wrap_content"
android:layout_height="wrap_content"

würde ich nicht machen benutze entweder match_parent oder eine sinnvolle feste Breite Höhe.
Damit auch klar ist nach was centerCrop arbeiten soll.

Was mir gerade kommt. Wenn man diese spezielle Activity nun für jede Auflösung macht und anpasst, dann sollte es doch klappen? Also Ordnerstruktur
Layout-xhdpi

Ja aber wenn dann für alle Auflösungen.

Ich würde wohl zu einen CostrainLayout greifen und das Prozentual gestalten nicht nach Pixeln.

PS was soll eigentlich der Code wir arbeiten doch mit Bitmaps.

— geändert am 20.01.2021, 19:03:50

Hilfreich?
Rafael K.Samsong
Kommentieren
Samsong
  • Forum-Beiträge: 18

20.01.2021, 19:07:22 via Website

Danke für die Aufklärung!

Habe jetzt leider keine zeit mehr das umzusetzen. Werde es morgen einmal mit dem CostrainLayout probieren und mich dann noch einmal bei euch melden :)

PS was soll eigentlich der Code wir arbeiten doch mit Bitmaps.

Bin jetzt ein bisschen verwirrt. Was meinst Du genau damit? Also Bitmaps kenn ich schon...

Also danke noch einmal für eure Hilfe! habt einen schönen Abend

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

20.01.2021, 19:35:49 via Website

Ich dachte du hast png Datein Bitmaps.

Dein code schaut mir nach etwas mit xml Vektor grafig aus.

Png setzte ich mit jpg Bitmap gleichg.
Vekto mit svg.

— geändert am 20.01.2021, 19:38:23

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

21.01.2021, 13:54:04 via Website

Hallo Samsong,

wie wäre es denn mal mit dem drawable-nodpi Ordner ? :-)

Damit sagst du dem System : Berücksichtige bitte nicht meine eigene DPI, sondern behandle das
RasterBitmap unangetastet.

— geändert am 21.01.2021, 13:54:39

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

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

21.01.2021, 13:59:26 via Website

So jetzt wieder.

Also es handelt sich um .png Bilder. Habe die .svg's wieder gelöscht

Mit Constraint Layout und dem prozentualen ging es wunderbar. Danke schön für die Hilfe!

Hilfreich?
Kommentieren