Różne rozdzielczości obsługują Androida

80

Edytowane pytanie:

Rozdzielczość mobilna:
Chciałbym zaprojektować różne rozdzielczości ekranu, takie jak poniższe rozdzielczości.
320x480,
480 × 800,
540x960,
720x1280 (Samsung S3),
1080x1920 (S4, Nexus5, Nexus 5x, Moto G4),
2560 x 1440 (Nexus 6, Nexus 6p, Samsung edge)

Rozdzielczość tabletu:
480x800 (micromax),
600x1024 ( samsung tab2),
800x1280 (nexus 7),
1200x1920 (nowy nexus 7),
2048x1536 (nexus 9)

Chcę używać różnych rozmiarów czcionek w zależności od rozdzielczości wyświetlacza urządzenia.

P1) Jaki jest bestsposób rozwiązania tego problemu problem?

Q2) Jaka jest najlepsza opcja do kodowania rzutowego lub XML?

Q3) Który folder do rysowania reprezentuje rozdzielczość urządzenia?

Q4) Rozmiar ikony programu uruchamiającego aplikacje dla innej rozdzielczości?

Bhavesh Jethani
źródło
16
Rozdzielczość ekranu nie ma znaczenia. Liczy się gęstość ekranu.
CommonsWare
2
Spójrz na [ta odpowiedź SO] [1] i wypróbuj swój kod. [1]: stackoverflow.com/questions/9877946/…
JJ86
Proszę, przestań wbijać swoje pytanie w trywialne zmiany. Jeśli to się powtórzy, zablokujemy pytanie.
Brad Larson
2
@Sotti: Rozmiary ekranu! = Rozdzielczości ekranu.
CommonsWare
1
@Sotti: Jeśli przeczytasz mój komentarz, zauważysz, że napisałem, że rozdzielczość ekranu nie ma znaczenia. Nie napisałem, że rozmiar ekranu nie ma znaczenia.
CommonsWare

Odpowiedzi:

189

Rozmiar ikony menu z aplikacjami w pikselach dla różnych rozdzielczości

Rozdzielczość mobilna

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

Układy tabletu:

Użyj następujących folderów, jeśli chcesz mieć układy specyficzne dla tabletu:

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

Foldery do rysowania:

  1. mobilny

    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. Rozdzielczość tabletu: wprowadź opis obrazu tutaj

    Rozmiary czcionek:

UWAGA: Zawsze staraj się używać SP, gdy masz do czynienia z textSize, na przykładtextsize=12sp

  1. Użyj predefiniowanych textAppearance:

    Ustawi rozmiar tekstu automatycznie zgodnie z gęstością urządzenia.

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

    Przykładowe użycie:

    <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. Użyj dimension.xmldla każdego urządzenia:

    Z Google IO Pdf widzimy strukturę poniżej:

    1. Mobilny:

      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 / dimens.xml (1440X2560 - Nexus 6, Samsung S6edge).

    2. Tablet:

      Do tabletu można użyć bardziej konkretnego folderu podobnego values-xlarge, values-large.

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

      lub

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

W celu uzyskania dalszych informacji:

  1. Zobacz Obsługa wielu ekranów .

  2. Zobacz stronę 77 w Google IO Pdf, gdzie opisano gęstość urządzeń projektowych . W ten sposób znajdziesz sposób obsługi dimens.xmlróżnych różnych urządzeń.

  3. Przygotowywanie aplikacji na Nexusa 6 i Nexusa 9 .

Fragment z obsługi wielu ekranów :

Piksel niezależny od gęstości jest równoważny jednemu fizycznemu pikselowi na ekranie o rozdzielczości 160 dpi, co jest podstawową gęstością przyjętą przez system dla ekranu o „średniej” gęstości. W czasie wykonywania system w przejrzysty sposób obsługuje skalowanie jednostek dp, jeśli jest to konieczne, na podstawie rzeczywistej gęstości używanego ekranu. Konwersja jednostek DP pikselach jest prosta px = dp * (dpi / 160). Na przykład na ekranie 240 dpi 1 dp odpowiada 1,5 fizycznego piksela. Podczas definiowania interfejsu użytkownika aplikacji należy zawsze używać jednostek dp, aby zapewnić prawidłowe wyświetlanie interfejsu użytkownika na ekranach o różnej gęstości.

Bhavesh Jethani
źródło
3
Więc naprawdę nie ma potrzeby implementowania żadnego kodu? po prostu utwórz wymiary, a aplikacja automatycznie sprawdzi, które przyciemnienie zastosować?
John R
1
+1: Nie zapominaj, że możesz obsługiwać wszystkie urządzenia za pomocą układów.
S.M_Emamian,
1
@ S.M_Emamian Dla tabletu: 1024X600 (layout-large-mdpi) 800X1280 (layout-large-tvdpi) 1200X1920 (layout-large-xhdpi) 1280X800 (layout-xlarge-mdpi) 2560X1600 (layout-xlarge-xhdpi) proszę sprawdzić urządzenie zamiast symulatora.
Bhavesh Jethani,
2
sprawdź również poniższy link, który może ci pomóc. stackoverflow.com/questions/14151121/…
Bhavesh Jethani
28

Najpierw utwórz foldery z różnymi wartościami dla różnych ekranów i umieść rozmiar zgodnie z ekranami w res->values->dimens.xmlpliku i wywołaj prosty rozmiar czcionki za pomocą "@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>

i pobierz rozmiar czcionki, TextViewjak podano poniżej.

<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
źródło
więc jak podałeś tutaj wymiary dla układów różnicowych? tak jak użyłeś dowolnych współczynników (1: 1.5: 2: 3: 4) - (mdpi-hdpi: xhdpi: xxhdpi: xxxhdpi) - (2sp: 3sp: 4sp: 6sp: 8sp) w ten sposób? Jestem zdezorientowany ..!
Asif Sb
@AsifSb jeśli chcesz podać to przez ratio, musisz ustawić to programowo, w przeciwnym razie musisz umieścić wymiary w sposób statyczny w różnych diemens.xml w folderach wartości
PankajSharma
9

Aby uniknąć problemów z różnymi rozdzielczościami ekranu i różnymi gęstościami, dopasowuję i ustawiam wszystko w oparciu o procentową szerokość i wysokość ekranu. Jeśli rozmiar tekstu zostanie zmieniony na podstawie procentowej szerokości lub wysokości ekranu, czcionka będzie miała prawidłowy rozmiar na wszystkich urządzeniach i we wszystkich rozdzielczościach. Aby uzyskać prawidłowy rozmiar czcionki na podstawie szerokości i wysokości jej przestrzeni, po prostu użyj tej funkcji:

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;
}

Oto kod, aby uzyskać szerokość i wysokość ekranu:

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(); 
}

Aby uzyskać żądany rozmiar czcionki, po prostu utwórz obszar na podstawie szerokości i wysokości ekranu i dostosuj go, aż rozmiar czcionki będzie wyglądał prawidłowo. Gdy sprawisz, że będzie dobrze wyglądał, powinien wyglądać dobrze na wszystkich urządzeniach.

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

mam nadzieję, że to Ci pomoże

Dan Bray
źródło
1
Odp. „ .. procentowa szerokość / wysokość ekranu ”. UWAGA: Ta strategia jest idealna dla ekranów ze stałą liczbą elementów; na ekranie wyświetlającym przewijaną listę elementów, w przypadku dużych telefonów wolę kompromis między „większym” a „pokaż więcej wierszy”. Możliwą formułą jest pomnożenie wszystkich rozmiarów czcionek przez sqrt(phoneWidthInches / defaultWidthInches), gdzie defaultWidthInchesjest oryginalny rozmiar telefonu, dla którego projektujesz. Tak więc 2x większy telefon będzie miał 1,4x większą czcionkę. (zamiast tego użyj odpowiedniego wzoru heightlub diagonal). Ważne : NIE UŻYWAJ szerokości w pikselach . inches = pixels / dpi.
ToolmakerSteve
8

Zasadniczo musisz utworzyć styl tekstu podobny do tego:

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

Przeczytaj więcej na ten temat tutaj http://developer.android.com/guide/topics/ui/themes.html

Korzystając z przewodnika obsługi Androida dla różnych ekranów, aby utworzyć różne rozmiary dla różnych ekranów w odpowiednich folderach res, jak opisano w: http://developer.android.com/guide/practices/screens_support.html

Uwaga dodatkowa: nie bardzo rozumiem, w jakiej sytuacji chciałbyś to zrobić, użycie jednostek SP dla rozmiarów czcionek spowoduje skalowanie czcionek, aby wyglądały mniej więcej tego samego rozmiaru na różnych telefonach.

Raanan
źródło
4

Najpierw projekt aplikacji dla jednej rozdzielczości.

przykład: załóżmy, że rozdzielczość telefonu komórkowego to 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 %

znaleźć rozmiar ekranu programowo, używając wzoru Belove

    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
źródło
chcę podać rozmiar tekstu .. dla innego rozmiaru urządzenia.
Bhavesh Jethani
@BhaveshJethani obliczyć procentowy rozmiar tekstu używając powyższego kodu, spróbuj kod działa dla mnie.
Hemantvc
3
mówię o rozmiarze czcionki ... a nie o rozmiarze widoku tekstu
Bhavesh Jethani
3

Myślę, że to dobra odpowiedź:

Rozmiar tekstu i różne rozmiary ekranu Androida

Ale tutaj, jak możesz to zrobić z rozdzielczością ekranu:

Możesz utworzyć katalog zasobów „wartości” dla każdego rozwiązania, na przykład

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

W każdym katalogu (włączając wartości domyślne dir) utwórz plik o nazwie „dimens.xml” z zawartością:

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

Teraz możesz użyć "@ dimen / def_font_size" lub stworzyć styl w katalogu wartości domyślnych.

Dodaj to do „styles.xml”:

<style name="FontSize">
    <item name="android:textSize">@dimen/def_font_size</item>
</style>
naif.ult
źródło
1

Stworzyłem funkcję, która konwertuje rozmiar dp na rozmiar zgodnie z rozmiarem ekranu i działa dobrze dla mnie. Każdy, kto ma problem z rozmiarem tekstu zgodnie z ekranem, powinien spróbować.

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

simple podaj wartość nadaną przez niego rozmiarowi widoku tekstu programowo, jak poniżej

tvTextView1.setTextSize(convertFromDp(24));
Furqan Ali
źródło
ta odpowiedź działa dla mnie. zmniejsz obciążenie pracą i obliczenia
Ranjith Kumar
1

Aby zapewnić obsługę urządzenia Nexus 6, utwórz folder drawable-560dpi i umieść w nim wszystkie obrazy.

Anand Savjani
źródło
Myślę, że wykonanie takiego układu nie jest konieczne i dobre, jednak drawable-xxxhdpi będzie jeszcze łatwiejsze i bardziej pomocne
Abhilash
nie będzie dla Nexusa 6. Ponieważ Nexus 6 ma rozdzielczość 560 dpi. Jeśli nie deklarujesz folderu 560dpi, użyje on obrazów z folderu xxxhdpi.
Anand Savjani,
Tak, aby było to proste i nie wskazywało samego Nexusa 6, zasugerowałem to. obrazy nie będą się tak bardzo różnić, więc xxxhdpi jest łatwiejsze.
Abhilash,