Підтримка різної роздільної здатності Android


80

Відредаговане запитання:

Мобільна роздільна здатність:
Я хотів би розробляти різні dpi екрану, як наступні роздільні здатності.
320x480,
480 × 800,
540x960 , 720x1280
(Samsung S3),
1080x1920 (S4, Nexus5, Nexus 5x, Moto G4),
2560 x 1440 (Nexus 6, Nexus 6p, Samsung edge)

Роздільна здатність планшета:
480x800 (мікромакс),
600x1024 ( Samsung tab2),
800x1280 (nexus 7),
1200x1920 (новий nexus 7),
2048x1536 (nexus 9)

Я хочу використовувати різні розміри шрифтів залежно від роздільної здатності дисплея пристрою.

Q1) Який bestспосіб це вирішити problem?

Q2) Що є найкращим варіантом для кодування коду або XML?

Q3) Яка папка для малювання відображає роздільну здатність пристрою?

Q4) Розмір піктограми панелі запуску програм для різної роздільної здатності?


16
Роздільна здатність екрану не має значення. Щільність екрану має значення.
CommonsWare

2
Погляньте на [цю відповідь SO] [1] і спробуйте свій код. [1]: stackoverflow.com/questions/9877946 / ...
JJ86

Будь ласка, перестаньте висловлювати своє запитання тривіальними редагуваннями. Якщо це продовжиться, запитання буде заблоковано.
Бред Ларсон

2
@Sotti: Розміри екрану! = Роздільна здатність екрана.
CommonsWare

1
@Sotti: Якщо ви прочитаєте мій коментар, ви помітите, що я писав, що роздільна здатність екрану не має значення. Я не писав, що розмір екрану не має значення.
CommonsWare

Відповіді:


189

Розмір піктограми панелі запуску програм у пікселях для різної роздільної здатності

Мобільна роздільна здатність

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

Макети планшетів:

Використовуйте такі папки, якщо ви хочете мати макети для планшетів:

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

Папки малюнків:

  1. Мобільний

    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. Роздільна здатність планшета: введіть тут опис зображення

    Розміри шрифту:

ПРИМІТКА: Завжди намагайтеся використовувати SP, коли маєте справу textSize, наприкладtextsize=12sp

  1. Використовуйте заздалегідь визначені textAppearance:

    Він автоматично встановить розмір тексту відповідно до щільності пристрою.

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

    Зразок використання:

    <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. Використовуйте dimension.xmlдля кожного пристрою:

    З Google IO Pdf ми бачимо структуру нижче:

    1. Мобільний телефон:

      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. Планшет:

      Для планшета ви можете використовувати більш конкретну папку , як values-xlarge, values-large.

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

      або

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

Для подальшої інформації:

  1. Див. Розділ Підтримка декількох екранів .

  2. Див. Сторінку №77 Google IO Pdf щодо проектування щільності пристрою . У цьому ви знайдете спосіб обробки dimens.xmlрізних пристроїв.

  3. Підготовка програм для Nexus 6 та Nexus 9 .

Витяг із підтримки декількох екранів :

Незалежний від щільності піксель еквівалентний одному фізичному пікселю на екрані 160 dpi, що є базовою щільністю, прийнятою системою для екрану "середньої" щільності. Під час виконання система прозоро обробляє будь-яке масштабування dp-одиниць, якщо це необхідно, виходячи з фактичної щільності використовуваного екрану. Перетворення Dp одиниць пікселів екрану проста: px = dp * (dpi / 160). Наприклад, на екрані 240 dpi 1 dp дорівнює 1,5 фізичному пікселю. Ви завжди повинні використовувати одиниці dp при визначенні інтерфейсу програми, щоб забезпечити належне відображення вашого інтерфейсу на екранах з різною щільністю.


3
Тож насправді немає необхідності реалізовувати будь-який код? просто створіть розміри, і програма автоматично перевірить, яку смугу застосовувати?
John R

1
+1: Не забувайте, що ви можете підтримувати всі пристрої, використовуючи макети.
S.M_Emamian

1
@ S.M_Emamian Для планшета: 1024X600 (layout-large-mdpi) 800X1280 (layout-large-tvdpi) 1200X1920 (layout-large-xhdpi) 1280X800 (layout-xlarge-mdpi) 2560X1600 (layout-xlarge-xhdpi) пристрій, а не симулятор.
Бхавеш Джетані

2
Будь ласка, також перевірте це посилання нижче, можливо, воно вам допоможе. stackoverflow.com/questions/14151121 / ...
Bhavesh Jethani


28

Спочатку ви створюєте папки різних значень для різних екранів. І встановлюєте розмір відповідно до екранів у res->values->dimens.xmlфайлі та викликаєте простий розмір шрифту за допомогою "@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>

та отримайте розмір шрифту, TextViewяк вказано нижче.

<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" />

так як ви дали розміри тут для макетів різниці? як у використовували будь-які співвідношення (1: 1,5: 2: 3: 4) - (mdpi-hdpi: xhdpi: xxhdpi: xxxhdpi) - (2sp: 3sp: 4sp: 6sp: 8sp) ось так? Я розгублений ..!
Asif Sb

@AsifSb, якщо ви хочете надати його за співвідношенням, ви повинні встановити його програмно. В іншому випадку ви повинні розміщувати розміри в статичному вигляді в різних diemens.xml у папках значень
PankajSharma

9

Щоб уникнути проблем з різною роздільною здатністю екрана та різною щільністю, я розмірюю та розміщую все на основі процентної ширини та висоти екрану. Якщо розмір тексту змінюється на основі процентної ширини або висоти екрана, шрифт буде правильним розміром на всіх пристроях та у всіх роздільних здатностях. Щоб отримати правильний розмір шрифту на основі ширини та висоти його простору, просто використовуйте цю функцію:

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

Ось код для отримання ширини та висоти екрана:

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

Щоб отримати потрібний розмір шрифту, просто складіть область на основі ширини екрана та висоти екрана та налаштовуйте його, доки розмір шрифту не буде виглядати правильно. Після того, як ви зрозумієте, що він виглядає правильно, він повинен виглядати правильно на всіх пристроях.

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

Сподіваюся, це вам допоможе


1
Повторно " .. відсоток ширини / висоти екрану ". ПРИМІТКА: Ця стратегія ідеально підходить для екранів з фіксованою кількістю предметів; на екрані, що відображає прокручуваний список елементів, для великих телефонів я віддаю перевагу компромісу між "більшими" та "показати більше рядків". Можлива формула - помножити всі розміри шрифтів на sqrt(phoneWidthInches / defaultWidthInches), де defaultWidthInchesоригінальний розмір телефону, який ви розробляєте. Отже, вдвічі більший телефон був би в 1,4 рази більшим шрифтом. (замість цього використовуйте heightабо diagonalформулу відповідно). Важливо : НЕ ВИКОРИСТОВУЙТЕ ширину в пікселях . inches = pixels / dpi.
ToolmakerSteve

8

В основному вам потрібно створити стиль тексту приблизно так:

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

докладніше про це читайте тут http://developer.android.com/guide/topics/ui/themes.html

А за допомогою керівництва з підтримки Android для різних екранів створіть потрібні розміри для різних екранів у потрібних папках res, як описано в: http://developer.android.com/guide/practices/screens_support.html

Примітка: Я насправді не розумію, в якій ситуації ви хочете це зробити, використовуючи одиниці SP для розмірів шрифтів, масштаб шрифтів буде виглядати більш-менш однаковим за різними телефонами.


4

Спочатку розробіть свій додаток для однієї роздільної здатності.

приклад: припустимо, ваш мобільний дозвіл 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 %

знайти розмір екрану програмно, використовуючи формулу 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);

я хочу вказати розмір тексту .. для різного розміру пристрою.
Бхавеш Джетані

@BhaveshJethani розрахувати відсоток текстового розміру, використовуючи наведений вище код, спробуйте це код для мене працює.
Hemantvc

3
я говорю про розмір шрифту .. не про розмір перегляду тексту
Bhavesh Jethani

3

Я думаю, це хороша відповідь:

Розмір тексту та різні розміри екрану для Android

Але ось як це можна зробити з роздільною здатністю екрана:

Ви можете створити каталог ресурсів "значень" для кожного дозволу, наприклад

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

У кожному каталозі (включаючи значення директорії за замовчуванням) створіть файл із назвою "dimens.xml" із вмістом:

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

Тепер ви можете використовувати "@ dimen / def_font_size" або створити стиль у каталозі значень за замовчуванням.

Додайте це до "styles.xml":

<style name="FontSize">
    <item name="android:textSize">@dimen/def_font_size</item>
</style>

1

Я створив функцію, яка перетворює розмір dp у розмір відповідно до розміру екрану, і це добре працює для мене. Кожен, хто має проблеми з розміром тексту відповідно до екрану, повинен спробувати.

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

просто надайте значення, задане ним, розміру перегляду тексту програмно, як показано нижче

tvTextView1.setTextSize(convertFromDp(24));

ця відповідь працює для мене. зменшити робоче навантаження та розрахунок
Ранджит Кумар

1

Для підтримки пристрою Nexus 6 створіть папку drawable-560dpi та помістіть у неї всі зображення.


Я вважаю, що не потрібно і добре робити такий макет, однак drawable-xxxhdpi буде ще простішим та кориснішим
Абхілаш

це не для зв'язку 6. Тому що nexus 6 має роздільну здатність 560 dpi. Якщо ви не заявляєте папку 560 dpi, тоді вона використовуватиме зображення папки xxxhdpi.
Ананд Савяні

Так, щоб зробити це простим, а не окремим нексусом 6, я запропонував це. зображення не будуть відрізнятися настільки, тому xxxhdpi простіше.
Абхілаш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.