Unterschiedliche Auflösung Unterstützung Android

80

Bearbeitete Frage:

Mobile Auflösung:
Ich möchte verschiedene Bildschirm-dpi wie die folgenden Auflösungen entwerfen. 320 x 480
,
480 x 800,
540
x 960, 720 x 1280 (Samsung S3),
1080
x 1920 (S4, Nexus5, Nexus 5x, Moto G4), 2560 x 1440 (Nexus 6, Nexus 6p, Samsung Edge)

Tablet-Auflösung:
480 x 800 (Mikromax),
600 x 1024 ( Samsung Tab2), 800 x
1280 (Nexus 7),
1200 x 1920 (neuer Nexus 7),
2048 x 1536 (Nexus 9)

Ich möchte je nach Bildschirmauflösung des Geräts unterschiedliche Schriftgrößen verwenden .

Q1) Wie kann das bestgelöst werden problem?

F2) Was ist die beste Option für Wurfcodierung oder XML?

F3) Welcher Zeichenordner repräsentiert welche Geräteauflösung?

F4) Größe des Application Launcher-Symbols für unterschiedliche Auflösung?

Bhavesh Jethani
quelle
15
Die Bildschirmauflösung spielt keine Rolle. Die Bildschirmdichte ist wichtig.
CommonsWare
2
Schauen Sie sich [diese SO-Antwort] [1] an und probieren Sie Ihren Code aus. [1]: stackoverflow.com/questions/9877946/…
JJ86
Bitte hören Sie auf, Ihre Frage mit trivialen Änderungen zu versehen. Wenn dies so weitergeht, werden wir die Frage sperren.
Brad Larson
2
@Sotti: Bildschirmgrößen! = Bildschirmauflösungen.
CommonsWare
1
@Sotti: Wenn Sie meinen Kommentar lesen, werden Sie feststellen, dass ich geschrieben habe, dass die Bildschirmauflösung keine Rolle spielt. Ich habe nicht geschrieben, dass die Bildschirmgröße keine Rolle spielt.
CommonsWare

Antworten:

188

Größe des App Launcher-Symbols in Pixel für unterschiedliche Auflösung

Mobile Auflösung

  • mipmap-mdpi (48 x 48)
  • mipmap-hdpi (72 x 72)
  • mipmap-xhdpi (96 x 96)
  • mipmap-xxhdpi (144X144)
  • mipmap-xxxhdpi (192X192)

Tablet-Layouts:

Verwenden Sie folgende Ordner, wenn Sie Tablet-spezifische Layouts wünschen:

layout-large-mdpi   (1024x600)
layout-large-tvdpi  (800x1280)
layout-large-xhdpi  (1200x1920)
layout-xlarge-mdpi  (1280x800)
layout-xlarge-xhdpi (2560x1600)

Drawables-Ordner:

  1. Handy, Mobiltelefon

    res/drawable        (default)
    res/drawable-ldpi/  (240x320 and nearer resolution)
    res/drawable-mdpi/  (320x480 and nearer resolution)
    res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
    res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
    res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
    res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6edge).
    
  2. Tablet-Auflösung: Geben Sie hier die Bildbeschreibung ein

    Schriftgrößen:

HINWEIS: Versuchen Sie immer , zu verwenden SP , wann immer Sie befassen sich mit textSize, wietextsize=12sp

  1. Verwenden Sie vordefinierte textAppearance:

    Die Textgröße wird automatisch entsprechend der Gerätedichte eingestellt.

    <TextView android:textAppearance="?android:attr/textAppearanceSmall"/>
    <TextView android:textAppearance="?android:attr/textAppearanceMedium"/>
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" />
    

    Beispielnutzung:

    <TextView
        style="@android:style/TextAppearance.Small"
        android:text="Sample Text - Small" />
    <TextView
        style="@android:style/TextAppearance.Medium"
        android:text="Sample Text  - Medium" />
    <TextView
        style="@android:style/TextAppearance.Large"
        android:text="Sample Text  - Large" />
    
  2. Verwendung dimension.xmlfür jedes Gerät:

    In Google IO Pdf sehen wir die folgende Struktur:

    1. Handy, Mobiltelefon:

      res/values/dimens.xml(default)
      res/values-ldpi/dimens.xml   (240x320 and nearer resolution)
      res/values-mdpi/dimens.xml   (320x480 and nearer resolution)
      res/values-hdpi/dimens.xml   (480x800, 540x960 and nearer resolution)
      res/values-xhdpi/dimens.xml  (720x1280 - Samsung S3, Micromax Canvas HD, etc)
      res/values-xxhdpi/dimens.xml (1080x1920 - Samsung S4, HTC one, etc)
      

      res / values-xxxhdpi / dimension.xml (1440X2560 - Nexus 6, Samsung S6edge).

    2. Tablette:

      Für Tablet können Sie spezifischere Ordner wie verwenden values-xlarge, values-large.

      res/values-large/dimens.xml      (480x800)
      res/values-large-mdpi/dimens.xml (600x1024)
      

      oder

      res/values-sw600dp/dimens.xml      (600x1024)
      res/values-sw720dp/dimens.xml      (800x1280)
      res/values-xlarge-xhdpi/dimens.xml (2560x1600 - Nexus 10")
      res/values-large-xhdpi/dimens.xml  (1200x1920 - Nexus 7"(latest))
      

Für weitere Informationen:

  1. Siehe Unterstützung mehrerer Bildschirme .

  2. Siehe Seite # 77 von Google IO PDF for Design Gerätedichte . Darin finden Sie die Möglichkeit, mit dimens.xmlverschiedenen Geräten umzugehen.

  3. Bereiten Sie Ihre Apps für Nexus 6 und Nexus 9 vor .

Auszug aus der Unterstützung mehrerer Bildschirme :

Das dichteunabhängige Pixel entspricht einem physikalischen Pixel auf einem 160-dpi-Bildschirm. Dies ist die Basisliniendichte, die vom System für einen Bildschirm mit "mittlerer" Dichte angenommen wird. Zur Laufzeit übernimmt das System bei Bedarf transparent die Skalierung der dp-Einheiten basierend auf der tatsächlichen Dichte des verwendeten Bildschirms. Die Konvertierung von dp-Einheiten in Bildschirmpixel ist einfach : px = dp * (dpi / 160). Auf einem 240-dpi-Bildschirm entspricht 1 dp beispielsweise 1,5 physischen Pixeln. Sie sollten beim Definieren der Benutzeroberfläche Ihrer Anwendung immer dp-Einheiten verwenden, um eine ordnungsgemäße Anzeige Ihrer Benutzeroberfläche auf Bildschirmen mit unterschiedlichen Dichten sicherzustellen.

Bhavesh Jethani
quelle
3
Es ist also wirklich nicht nötig, Code zu implementieren? Erstellen Sie einfach die Abmessungen und die App überprüft automatisch, welche Abmessung angewendet werden soll.
John R
1
+1: Vergessen Sie nicht, dass Sie alle Geräte mithilfe von Layouts unterstützen können.
S.M_Emamian
1
@ S.M. Gerät statt Simulator.
Bhavesh Jethani
2
Bitte überprüfen Sie auch diesen unten stehenden Link, um Ihnen zu helfen. stackoverflow.com/questions/14151121/…
Bhavesh Jethani
27

Zuerst erstellen Sie die Ordner mit verschiedenen Werten für verschiedene Bildschirme. Fügen Sie die Größe entsprechend den Bildschirmen in die res->values->dimens.xmlDatei ein und rufen Sie die einfache Schriftgröße mit auf "@dimen/text_size".

res/values/dimens.xml    
res/values-small/dimens.xml    
res/values-normal/dimens.xml    
res/values-xlarge/dimens.xml

//for small    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">15sp</dimen>
</resources>

//for normal    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">20sp</dimen>
</resources>

//for large    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">30sp</dimen>
</resources>

//for xlarge    
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">40sp</dimen>
</resources>

und rufen Sie die Schriftgröße TextViewwie unten angegeben ab.

<TextView
    android:id="@+id/lblHeader"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"           
    android:textSize="@dimen/text_size"
    android:textStyle="bold"
    android:typeface="serif" />
PankajSharma
quelle
Wie haben Sie hier die Abmessungen für Diff-Layouts angegeben? 8sp) so? Ich bin verwirrt ..!
Asif Sb
@AsifSb Wenn Sie es nach Verhältnis geben wollen, müssen Sie es programmatisch einstellen. Andernfalls müssen Sie die Abmessungen statisch in verschiedenen diemens.xml in Wertordnern
ablegen
9

Um die Probleme unterschiedlicher Bildschirmauflösungen und unterschiedlicher Dichte zu vermeiden, dimensioniere und positioniere ich alles basierend auf der prozentualen Breite und Höhe des Bildschirms. Wenn die Größe des Texts basierend auf der prozentualen Breite oder Höhe des Bildschirms geändert wird, hat die Schriftart auf allen Geräten und allen Auflösungen die richtige Größe. Verwenden Sie einfach diese Funktion, um die richtige Schriftgröße basierend auf der Breite und Höhe des Bereichs zu erhalten:

private float SetTextSize(String text, int width, int height)
{
    Paint paint = new Paint();
    float textWidth = paint.measureText(text);
    float textSize = (int) ((width / textWidth) * paint.getTextSize());
    paint.setTextSize(textSize);

    textWidth = paint.measureText(text);
    textSize = (int) ((width / textWidth) * paint.getTextSize());

    // Re-measure with font size near our desired result
    paint.setTextSize(textSize);

    // Check height constraints
    FontMetricsInt metrics = paint.getFontMetricsInt();
    float textHeight = metrics.descent - metrics.ascent;
    if (textHeight > height)
    {
        textSize = (int) (textSize * (height / textHeight));
        paint.setTextSize(textSize);
    }
    return textSize;
}

Hier ist der Code, um die Breite und Höhe des Bildschirms zu ermitteln:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
{
    Point size = new Point();
    getWindowManager().getDefaultDisplay().getSize(size);
    screenWidth = size.x;
    screenHeight = size.y; 
}
else
{
    Display display = getWindowManager().getDefaultDisplay(); 
    screenWidth = display.getWidth(); 
    screenHeight = display.getHeight(); 
}

Um die gewünschte Schriftgröße zu erhalten, erstellen Sie einfach einen Bereich basierend auf der Bildschirmbreite und der Bildschirmhöhe und passen Sie ihn an, bis die Schriftgröße richtig aussieht. Sobald Sie es richtig aussehen lassen, sollte es auf allen Geräten richtig aussehen.

float textSize = SetTextSize("text", (int) (screenWidth * 0.1), (int) (screenHeight * 0.15));

ich hoffe das hilft dir

Dan Bray
quelle
1
Zu " .. prozentuale Breite / Höhe des Bildschirms ". HINWEIS: Diese Strategie eignet sich perfekt für Bildschirme mit einer festen Anzahl von Elementen. Auf einem Bildschirm, auf dem eine Liste mit Elementen angezeigt wird, bevorzuge ich bei großen Telefonen einen Kompromiss zwischen "größer" und "mehr Zeilen anzeigen". Eine mögliche Formel besteht darin, alle Schriftgrößen mit der ursprünglichen Telefongröße zu multiplizieren sqrt(phoneWidthInches / defaultWidthInches), für defaultWidthInchesdie Sie sie entwerfen. 2x größere Telefone wären also 1,4x größere Schriftarten. (Verwenden Sie stattdessen heightoder diagonalFormel entsprechend). Wichtig : Verwenden Sie NICHT die Breite in Pixel . inches = pixels / dpi.
ToolmakerSteve
8

Grundsätzlich müssen Sie einen Textstil wie folgt erstellen:

<style name="CodeFont">
    <item name="android:textSize">30sp</item>
</style>

Lesen Sie hier mehr darüber http://developer.android.com/guide/topics/ui/themes.html

Verwenden Sie die Anleitung zur Unterstützung von Android für verschiedene Bildschirme, um die verschiedenen Größen für verschiedene Bildschirme in den richtigen Res-Ordnern zu erstellen, wie unter http://developer.android.com/guide/practices/screens_support.html beschrieben

Randnotiz: Ich verstehe nicht wirklich, in welcher Situation Sie das tun möchten. Wenn Sie SP-Einheiten für Schriftgrößen verwenden, werden die Schriftarten so skaliert, dass sie auf verschiedenen Telefonen mehr oder weniger gleich groß sind.

Raanan
quelle
4

Zuerst Ihr Anwendungsdesign für eine Auflösung.

Beispiel: Angenommen, Ihre mobile Auflösung beträgt 380 * 480

       mobile screen width:380

       textView size is 80dp   
       Assume : if width is 380dp then 100 % then

               textview width 80dp then how many %(per).

            ower answer is: 25 %

Ermitteln Sie die Bildschirmgröße programmgesteuert mithilfe der folgenden Formel

    DisplayMetric  displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    ScreenHeight = displaymetrics.heightPixels;
    ScreenWidth = displaymetrics.widthPixels;
        txt_height = (int)((ScreenHeight*14.58)/100);
    txt_width = (int)((ScreenWidth*37.5)/100);


    LinearLayout.LayoutParams normal_param = new LinearLayout.LayoutParams(txt_height ,txt_width );

    txt_Name.setLayoutParams(normal_param);
Hemantvc
quelle
Ich möchte Textgröße geben .. für verschiedene Gerätegröße.
Bhavesh Jethani
@ BhaveshJethani Berechnen Sie den Prozentsatz der Textgröße mit dem obigen Code. Versuchen Sie es. Der Code funktioniert für mich.
Hemantvc
3
Ich spreche über Schriftgröße .. nicht Textansicht Größe
Bhavesh Jethani
3

Ich denke, das ist eine gute Antwort:

Textgröße und verschiedene Android-Bildschirmgrößen

Aber hier, wie Sie es mit Bildschirmauflösung machen können:

Sie können Ressourcenverzeichnis "Werte" für jede Auflösung wie erstellen

values-wWIDTHp-hHEIGHTdp (you can also use values-wWIDTHp or values-hHEIGHTdp)
for example: 320*480 will be values-w320p-h480dp

Erstellen Sie in jedem Verzeichnis (einschließlich der Standardwerte dir) eine Datei mit dem Namen "dimension.xml" mit folgendem Inhalt:

 for exmaple (the value related to the resolution):
 <dimen name="def_font_size">10sp</dimen>

Jetzt können Sie "@ dimen / def_font_size" verwenden oder einen Stil im Standardwertverzeichnis erstellen.

Fügen Sie dies der "styles.xml" hinzu:

<style name="FontSize">
    <item name="android:textSize">@dimen/def_font_size</item>
</style>
naif.ult
quelle
1

Ich habe eine Funktion erstellt, die die Größe von dp in die Größe entsprechend der Bildschirmgröße konvertiert, und sie funktioniert gut für mich. Jeder, der Probleme mit der Textgröße je nach Bildschirm hat, sollte dies versuchen.

public float convertFromDp(int input) {
    final float scale = getResources().getDisplayMetrics().density;
    return ((input - 0.5f) / scale);
}

Geben Sie einfach den von ihm angegebenen Wert für die Größe der Textansicht programmgesteuert wie unten an

tvTextView1.setTextSize(convertFromDp(24));
Furqan Ali
quelle
Diese Antwort funktioniert für mich. Arbeitsbelastung und Berechnung reduzieren
Ranjith Kumar
1

Erstellen Sie für die Unterstützung von Nexus 6-Geräten den Ordner drawable-560dpi und legen Sie alle Bilder darin ab.

Anand Savjani
quelle
Ich denke, es ist nicht notwendig und gut, ein bestimmtes Layout wie dieses zu erstellen. Drawable-xxxhdpi wird jedoch noch einfacher und hilfreicher sein
Abhilash
es wird nicht für Nexus 6. Weil Nexus 6 eine Auflösung von 560 dpi hat. Wenn Sie keinen Ordner mit 560 dpi deklarieren, werden Bilder des Ordners xxxhdpi verwendet.
Anand Savjani
Ja, um es einfach zu machen und Nexus 6 nicht genau zu bestimmen, habe ich das vorgeschlagen. Bilder unterscheiden sich nicht so sehr, so dass xxxhdpi einfacher ist.
Abhilash