Как определить размеры. XML для каждого размера экрана в Android?

При поддержке разных размеров экрана (плотности) в Android часто основное внимание уделяется созданию разных макетов для каждого возможного экрана. IE

  • ldpi
  • MDPI
  • ИПЧР
  • xhdpi
  • xxhdpi
  • xxxhdpi

Я разработал макет для экрана xhdpi в качестве справочного материала и определил его размеры в dimensions.xml. Теперь я хочу поддержать его на всех возможных размерах экрана. Как я могу это сделать?

Насколько я знаю, я могу использовать этот инструмент, чтобы выяснить правильные размеры.xml для других размеров экрана и добавить его в свой проект. Это правильный способ сделать это в моей ситуации?

Другой вопрос, нужно ли мне только создавать размер.xml для размеров экрана выше? Если да, то что w820dp ?

Спасибо за вашу помощь. Мне нужно поддерживать только телефоны (не планшеты или другие устройства).

10 ответов

Решение

Вы должны создать папку "Разные значения" для разных экранов. подобно

values-sw720dp          10.1” tablet 1280x800 mdpi

values-sw600dp          7.0”  tablet 1024x600 mdpi

values-sw480dp          5.4”  480x854 mdpi 
values-sw480dp          5.1”  480x800 mdpi 

values-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxxhdpi           5.5" 1440x2560 xxxhdpi

values-xhdpi            4.7”   1280x720 xhdpi 
values-xhdpi            4.65”  720x1280 xhdpi 

values-hdpi             4.0” 480x800 hdpi
values-hdpi             3.7” 480x854 hdpi

values-mdpi             3.2” 320x480 mdpi

values-ldpi             3.4” 240x432 ldpi
values-ldpi             3.3” 240x400 ldpi
values-ldpi             2.7” 240x320 ldpi

Для получения дополнительной информации вы можете посетить здесь

Различные значения папок в Android

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

Отредактировано humblerookie

Вы можете использовать плагин Android Studio под названием Dimenify для автоматической генерации значений размеров для других блоков пикселей на основе пользовательских масштабных коэффициентов. Он все еще находится в бета-версии, обязательно сообщите о любых проблемах / предложениях, с которыми вы столкнетесь, разработчику.

Используйте масштабируемый DP

Хотя теоретически хорошая идея сделать разную компоновку для экрана разных размеров, это может быть очень трудно приспособить для всех размеров экрана и плотности пикселей. Более 20 разных dimens.xml Файлы, как указано в ответах выше, не так просто управлять.

Как пользоваться:

Использовать sdp:

  1. Включают implementation 'com.intuit.sdp:sdp-android:1.0.5' в вашем build.gradle,
  2. Заменить любой dp значение, такое как 50dp с @dimen/50_sdp вот так:

    <TextView
     android:layout_width="@dimen/_50sdp"
     android:layout_height="@dimen/_50sdp"
     android:text="Hello World!" />
    

Как это устроено:

sdp масштабируется с размером экрана, потому что это по сути огромный список различных dimens.xml на все возможные dp значение.

введите описание изображения здесь

Увидеть его в действии:

Здесь это на трех устройствах с широко различающимися размерами экрана и плотности:

введите описание изображения здесь

Обратите внимание, что sdp Расчет размера единицы включает в себя некоторое приближение из-за некоторых ограничений производительности и удобства использования.

Мы хотим видеть изменения требуемого размера просмотра на разных экранах.

Нам нужно создать разные папки значений для разных экранов и поместить файл измерения. XML в зависимости от плотности экрана.

Я взял один TextView и наблюдал за изменениями, когда я изменял Dimens.xml в разных папках значений.

Пожалуйста, следуйте процессу

нормальный - xhdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем обычные - xhdpi \ dimensions.xml

Nexus 5X ( 5,2" * 1080 * 1920: 420 точек на дюйм)

Nexus 6P ( 5, 7" * 1440 * 2560: 560 точек на дюйм)

Nexus 6 ( 6,0" * 1440 * 2560: 560 точек на дюйм)

Nexus 5 (5,0 ", 1080 1920: xxhdpi)

Nexus 4 (4, 7 ", 768 * 1280: xhdpi)

Galaxy Nexus (4, 7 ", 720 * 1280: xhdpi)

4,65 "720p (720 * 1280: xhdpi)

4, 7" WXGA ( 1280 * 720: XHDPI)

Xlarge - xhdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов при изменении Xlarge - xhdpi \ dimensions.xml.

Nexus 9 ( 8,9", 2048 * 1556: xhdpi)

Nexus 10 (10,1", 2560 * 1600: xhdpi)

большой - xhdpi \ dimensions.xml

Приведенные ниже устройства могут менять размеры экранов, когда мы меняем большие - xhdpi \ dimensions.xml

Nexus 7 (7,0 ", 1200 * 1920: xhdpi)

Nexus 7 (2012) (7,0 ", 800 * 1280: tvdpi)

Приведенные ниже экраны отображаются в "Поиск общих телефонов и планшетов"

большой - mdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем большие - mdpi \ dimensions.xml

5,1" WVGA ( 480 * 800: т / д)

5,4" FWVGA ( 480 * 854: т / д)

7,0" WSVGA (планшет) ( 1024 * 600: т / д)

нормальный - hdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем обычные - hdpi \ sizess.xml

Nexus S (4,0 ", 480 * 800: HDMI)

Nexus One (3, 7 ", 480 * 800: HDMI)

маленький - ldpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем маленькие - ldpi \ sizess.xml

2.7 "QVGA Slider (240 * 320: ldpi)

2, 7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов при изменении xlarge - mdpi \ dimensions.xml

10,1" WXGA (планшет) ( 1280 * 800: MDPI)

нормальный - ldpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем нормальные - ldpi \ dimensions.xml

3,3 "WQVGA (240 * 400: LDPI)

3,4" WQVGA ( 240 * 432: LDPI)

нормальный - hdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем обычные - hdpi \ sizess.xml

4,0" WVGA ( 480 * 800: HDMI)

3, 7" WVGA ( 480 * 800: HDMI)

3, 7-дюймовый слайдер FWVGA (480 * 854: HDMI)

обычный - mdpi \ dimensions.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем обычные - mdpi \ dimensions.xml

Слайдер 3,2" HVGA (ADP1) (320 * 480: MDPI)

3,2" QVGA ( ADP2) ( 320 * 480: MDPI)

Есть хорошие библиотеки, которые справятся со всем и уменьшат вашу боль. Для его использования просто добавьте две зависимости в gradle:

 implementation 'com.intuit.ssp:ssp-android:1.0.5'
 implementation 'com.intuit.sdp:sdp-android:1.0.5'

После этого используйте dimens как это:

        android:layout_marginTop="@dimen/_80sdp"

Я загрузил простую Java-программу, которая принимает местоположение вашего проекта и файл измерения, который вы хотите ввести. Исходя из этого, он выведет соответствующий файл измерений в консоль. Вот ссылка на него:

https://github.com/akeshwar/Dimens-for-different-screens-in-Android/blob/master/Main.java

Вот полный код для ссылки:

public class Main {


    /**
     * You can change your factors here. The current factors are in accordance with the official documentation.
     */
    private static final double LDPI_FACTOR = 0.375;
    private static final double MDPI_FACTOR = 0.5;
    private static final double HDPI_FACTOR = 0.75;
    private static final double XHDPI_FACTOR = 1.0;
    private static final double XXHDPI_FACTOR = 1.5;
    private static final double XXXHDPI_FACTOR = 2.0;

    private static double factor;

    public static void main(String[] args) throws IOException {


        Scanner in = new Scanner(System.in);
        System.out.println("Enter the location of the project/module");
        String projectPath = in.nextLine();

        System.out.println("Which of the following dimension file do you want?\n1. ldpi \n2. mdpi \n3. hdpi \n4. xhdpi \n5. xxhdpi \n6. xxxhdpi");

        int dimenType = in.nextInt();

        switch (dimenType) {
            case 1: factor = LDPI_FACTOR;
                break;
            case 2: factor = MDPI_FACTOR;
                break;
            case 3: factor = HDPI_FACTOR;
                break;
            case 4: factor = XHDPI_FACTOR;
                break;
            case 5: factor = XXHDPI_FACTOR;
                break;
            case 6: factor = XXXHDPI_FACTOR;
                break;
            default:
                factor = 1.0;
        }

        //full path = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/src/main/res/values/dimens.xml"
        //location of the project or module = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/"


        /**
         * In case there is some I/O exception with the file, you can directly copy-paste the full path to the file here:
         */
        String fullPath = projectPath + "/src/main/res/values/dimens.xml";

        FileInputStream fstream = new FileInputStream(fullPath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine;

        while ((strLine = br.readLine()) != null)   {
            modifyLine(strLine);
        }
        br.close();

    }

    private static void modifyLine(String line) {

        /**
         * Well, this is how I'm detecting if the line has some dimension value or not.
         */
        if(line.contains("p</")) {
            int endIndex = line.indexOf("p</");

            //since indexOf returns the first instance of the occurring string. And, the actual dimension would follow after the first ">" in the screen
            int begIndex = line.indexOf(">");

            String prefix = line.substring(0, begIndex+1);
            String root = line.substring(begIndex+1, endIndex-1);
            String suffix = line.substring(endIndex-1,line.length());


            /**
             * Now, we have the root. We can use it to create different dimensions. Root is simply the dimension number.
             */

            double dimens = Double.parseDouble(root);
            dimens = dimens*factor*1000;
            dimens = (double)((int)dimens);
            dimens = dimens/1000;
            root = dimens + "";

            System.out.println(prefix + " " +  root + " " + suffix );

        }

        System.out.println(line);
    }
}

Вы должны создать другой values папку для разных экранов и ставить dimens.xml файл в соответствии с плотностями.

1) values

2) values-hdpi (320x480 ,480x800)

3) values-large-hdpi (600x1024)

4) values-xlarge (720x1280 ,768x1280 ,800x1280 ,Nexus7 ,Nexus10)

5) values-sw480dp (5.1' WVGA screen)

6) values-xhdpi (Nexus4 , Galaxy Nexus)

Вы можете положить dimens.xml в

1) значения

2) значения-hdpi

3) значения-xhdpi

4) значения-xxhdpi

И дать разные размеры в dimens.xml в соответствующих папках в зависимости от плотности.

Основной принцип повышения гибкости вашего кода заключается в инкапсуляции того, что меняется/меняется (или что, скорее всего, изменится).

Если размеры вашего корпуса меняются. Итак, вы начинаете с переноса ваших измерений (тех, которые, по вашему мнению, нужно изменить) из кода XML или из кода java/kotlin в файл values/dimens.xml.

В контексте этого вопроса. У вас могут быть папки res по квалификаторам плотности или по квалификаторам малой ширины.

      values/dimens.xml
values-ldpi/dimens.xml
values-hdpi/dimens.xml

values/dimens.xml
values-sw320dp/dimens.xml
values-sw320dp/dimens.xml
 

Здесь важно отметить один важный момент: элементы в values/dimens.xml будут применяться к экранам, меньшим, чем самая низкая точка останова, которую вы указали.

      values/dimens.xml //smallest screen
values-sw320dp/dimens.xml //320dp or more till next breakpoint folder
values-sw360dp/dimens.xml//360dp or more till next breakpoint folder

Еще один важный момент, который следует отметить, заключается в том, что устройство с высокой плотностью пикселей может иметь небольшой экран. Поэтому убедитесь, что вы хотите указать квалификатор плотности или квалификатор ширины экрана.


Небольшой брифинг для тех, кто плохо знаком с этим аспектом.

Вы можете добавлять квалификаторы в разные папки ресурсов, такие как значения, чертежи и макет.

Эти квалификаторы могут представлять язык (-en,-hi), ориентацию (-land,-port) или диапазон размеров экрана (-ldpi,-hdpi).

Соглашение об именах имеет иерархию квалификаторов, и квалификаторы должны добавляться только в этом порядке.

          values-en-hdpi (it cannot be values-hdpi-en)
    values-en-land-hdpi (it cannot be values values-hdpi-en-land or any other order)
layout-hdpi

Заказ задокументирован в Таблице 2 на этой странице

Некоторые квалификаторы представляют абсолютные значения, тогда как другие, такие как ldpi, hdpi, представляют собой точки останова.

Если вы хотите увидеть больше: Вот ссылка на список устройств (планшет, мобильный телефон, часы), в том числе watch,chromebook, windows а также mac, Здесь вы можете найти плотность, размеры и т. Д. Просто основываясь здесь, это хороший ресурс, если вы тоже используете эмулятор.

Если вы щелкнете по определенному элементу, он отобразит больше деталей в правой части. образец

Так как это Android Буду публиковать, связанные с этим. sample1

sample2

~ Лучше, если вы сохраните копию в Интернете. Для просмотра в автономном режиме.

В Android 3.2 представлен новый подход к размерам экрана: числа, описывающие размер экрана, приведены в единицах "dp". Чаще всего мы можем использовать

наименьшая ширина dp: наименьшая ширина, доступная для макета приложения в единицах "dp"; это самая маленькая ширина dp, с которой вы когда-либо сталкивались при любом повороте экрана.

Чтобы создать один щелчок правой кнопкой мыши на res >>> new >>> Каталог ресурсов Android

Из окна " Доступные квалификаторы" переместите наименьшую ширину экрана к выбранным классификаторам.

В окне Screen width просто напишите значение "dp", начиная с того, что вы хотите, чтобы Android Studio использовала эти размеры.

Затем перейдите в представление Project, щелкните правой кнопкой мыши на новом созданном каталоге ресурсов.

new >>> Значения файла ресурсов введите новое имя файла Dimens.xml, и все готово.

Другие вопросы по тегам