it-roy-ru.com

Какой размер изображения я должен спросить у разработчика интерфейса?

У меня есть ImageView с этими атрибутами:

   Android:layout_width="match_parent"
   Android:layout_height="160dp"

Разработчик пользовательского интерфейса спрашивает меня о размере изображения, которое я хочу в px. Какой размер я должен спросить? Стоит ли спрашивать разные размеры для разных устройств?

Заметка

У меня нет ImageView с определенной высотой и шириной. Моя ImageView ширина match_parent не определенная ширина.

Все ответы говорят о том, что я должен использовать конвертер. Как я могу конвертировать match_parent в px?

Согласно ответам, я должен спросить о шести изображениях, не так ли?

8
salman

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

Обычно приложение для Android поддерживает плотность экрана ldpi при минимуме и xxxhdpi при максимуме.

Step1: Если вы хотите, чтобы размер изображения был 160 x 160 dp, тогда предоставьте разработчику UI максимальный размер изображения, связанный с максимальной плотностью экрана.

160 x 4 = 640x640 px (why multiply by 4? I will explain later)

Шаг 2: Масштабировать изображение 640x640 px до меньшего размера в зависимости от плотности экрана

  • ldpi: 160 x 0,75 = 120x120 пикселей
  • mdpi: 160 x 1 = 160x160 px
  • hdpi: 160 x 1,5 = 240x240 пикселей
  • xhdpi: 160 x 2 = 320x320 пикселей
  • xxhdpi: 160 x 3 = 480x480 px
  • xxxhdpi: 160 x 4 = 640x640 px

Советы: Найдите, что ваш размер изображения соответствует экрану плотности mdpi (известный как base density или 1X плотности), затем масштабируйте до других плотностей по следующей формуле

 Density buckets

Update: From https://material.io/tools/devices/ , размер экрана для базовой плотности равен 360x640 px. Таким образом, ваш размер ImageView будет 360x160 px на экране плотности 1X.

ldpi: 270x120 px 
mdpi: 360x160 px
hdpi: 540x240 px
xhdpi: 720x320 px
xxhdpi: 1280x480 px
xxxhdpi: 1440x640 px
8
Tommy

Почему вы не используете Vector drawable?

Зачем использовать Векторы?

  1. Данные могут быть представлены в исходном разрешении без обобщения.
  2. Графический вывод изображений более приятен, чем созданный как растровое изображение
  3. Другой очень важной причиной использования векторной графики, а не растровой, является их размер. Векторные объекты намного меньше, чем растровые изображения. Если у нас есть полноразмерное изображение для обновления, векторный файл может занимать всего несколько килобайт в вашей системе, тогда как такое же изображение в растровом формате среднего разрешения может не помещаться на CD-ROM.

Вы должны использовать изображения SVG в вашем проекте.

Создать SVG вместо файлов PNG

3
Mitesh Vanaliya

попробуйте этот исходный код

Display display = getWindowManager().getDefaultDisplay();
String displayName = display.getName();  // minSdkVersion=17+
Log.i(TAG, "Pantalla          = " + displayName);

// Tamaño en píxeles
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Log.i(TAG, "Ancho             = " + width);
Log.i(TAG, "Alto              = " + height);

// dpi
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heightPixels = metrics.heightPixels;
int widthPixels = metrics.widthPixels;
int densityDpi = metrics.densityDpi;
float xdpi = metrics.xdpi;
float ydpi = metrics.ydpi;
Log.i(TAG, "Ancho en píxeles  = " + widthPixels);
Log.i(TAG, "Alto en píxeles   = " + heightPixels);
Log.i(TAG, "Densidad dpi      = " + densityDpi);
Log.i(TAG, "x dpi             = " + xdpi);
Log.i(TAG, "y dpi             = " + ydpi);

// Deprecated
int screenHeight = display.getHeight();
int screenWidth = display.getWidth();
Log.i(TAG, "Alto de pantalla  = " + screenHeight);
Log.i(TAG, "Ancho de pantalla = " + screenWidth);

// Orientación 
int orientation = getResources().getConfiguration().orientation;
Log.i(TAG, "Orientación       = " + orientation);
0
jmorales

Хорошо, вы хотите установить высоту изображения размером 160 dp (так как она в dp, это размер в mdpi). Так что вам нужно попросить UI разработчика сделать вам изображение высоты в 4 раза больше. Высота изображения = 4 * 160. После этого вы можете использовать Batch Drawable Importer из Android Studio, чтобы сделать изображение для всех различных разрешений. Надеюсь, поможет.

0
Rai_Gaurav

Надеюсь, это поможет ...

mdpi - эталонная плотность, т. е. 1 пиксель на дисплее mdpi равен 1 провалу. Коэффициент для масштабирования активов:

ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi
0.75 | 1    | 1.5  | 2     | 3      | 4

Хотя вам не нужно беспокоиться о tvdpi, если вы не разрабатываете специально для Google TV или оригинального Nexus 7 - но даже Google рекомендует просто использовать ресурсы hdpi. Вам, вероятно, также не нужно беспокоиться о xxhdpi (хотя это никогда не повредит, и, по крайней мере, значок запуска должен быть предоставлен в xxhdpi), а xxxhdpi сейчас является лишь константой в исходном коде (ни одно устройство не использует и не делает Я ожидаю что-нибудь какое-то время, если вообще когда-нибудь), так что это также можно игнорировать.

Это означает, что если вы делаете изображение с разрешением 48 точек на дюйм и планируете поддерживать разрешение до xhdpi, вам следует начать с изображения размером 96 пикселей (144 пикселя, если вы хотите использовать собственные ресурсы для xxhdpi) и создать следующие изображения для плотностей:

ldpi    | mdpi    | hdpi    | xhdpi     | xxhdpi    | xxxhdpi
36 x 36 | 48 x 48 | 72 x 72 | 96 x 96   | 144 x 144 | 192 x 192

И они должны отображаться примерно одинакового размера на любом устройстве, при условии, что вы поместили их в специфичные для плотности папки (например, drawable-xhdpi, drawable-hdpi и т.д.)

Для справки, плотность пикселей для них:

ldpi  | mdpi  | hdpi  | xhdpi  | xxhdpi  | xxxhdpi
120   | 160   | 240   | 320    | 480     | 640
0
Viral Patel

Разные устройства имеют разные размеры

Android:adjustViewBounds="true" автоматически подбирает высоту изображения

так что вы можете это,

    <ImageView
        Android:id="@+id/ivImage"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:adjustViewBounds="true"/>
0
Gautam Surani

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

 enter image description here

Рисунок 1. Относительные размеры для растровых изображений с разными размерами плотности

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

Таблица 1. Спецификаторы конфигурации для разных плотностей пикселей.

 enter image description here

Чтобы создать альтернативные растровые рисунки для разных плотностей, вы должны соблюдать3: 4: 6: 8: 12: 16 масштабный коэффициент _ ​​между шестью основными плотностями. Например, , если у вас есть растровое изображение, которое это48x48 пикселей для экранов средней плотности, все разные размеры должны быть:

  • 36x36 пикселей (0,75x) для низкой плотности (ldpi)
  • 48x48 пикселей (1,0x базовый уровень) для средней плотности (т/д)
  • 72x72 пикселей (1,5x) для высокой плотности (hdpi)
  • 96x96 пикселей (2,0x) для сверхвысокой плотности (xhdpi)
  • 144x144 пикселей (3,0x) для сверхвысокой плотности (xxhdpi)
  • 192x192 пикселей (4,0x) для сверх-экстра-сверх-высокой плотности (xxxhdpi)

Затем поместите сгенерированные файлы изображений в соответствующий подкаталог под res /, и система автоматически выберет правильный файл в зависимости от плотности пикселей устройства, на котором работает ваше приложение:

рез /

  • рисуем-xxxhdpi /

     awesome-image.png
    
  • рисуем-xxhdpi /

     awesome-image.png
    
  • рисуем-xhdpi /

     awesome-image.png
    
  • рисуем-ИПЧР /

     awesome-image.png
    
  • рисуем-MDPI /

     awesome-image.png
    

Затем, каждый раз, когда вы ссылаетесь на @ drawable/awesomeimage, система выбирает соответствующее растровое изображение на основе разрешения экрана. Если вы не предоставите специфичный для плотности ресурс для этой плотности, система выберет следующее наилучшее совпадение и масштабирует его по размеру экрана.

  • Совет: Если у вас есть некоторые ресурсы для рисования, которые система никогда не должна масштабировать (возможно, из-за того, что вы сами вносите некоторые изменения в образ во время выполнения), вы должны поместить их в каталог с квалификатором конфигурации nodpi. Ресурсы с этим классификатором считаются независимыми от плотности, и система не будет их масштабировать.

Официальный источник:Плотность экрана

0
Nitin Gurbani

Вы должны пойти с 1440x640 для наибольшего размера.

Если вы хотите поддерживать несколько устройств с несколькими изображениями, вы можете иметь 5 стандартных срезов изображений.

mdpi : 360x160 hdpi : 540x240 xhdpi : 720x320 xxhdpi : 1080x480 xxxhdpi : 1440x640


Я придумал эти размеры изображений, потому что, если вы посмотрите на наиболее распространенные размеры экрана, самый большой из них - 1440x2960 от Samsung Galaxy S8. (Я знаю о 2160x3840, но это не основной поток, и я бы даже сказал, что это безумие).

В вашем случае вы установили ширину match_parent, которая в каждом случае самого большого (или даже пользовательского) DPI будет максимум 1440px, так что вы можете быть чертовски уверены, что в 99% случаев она не будет превышать его. (Большинство современных устройств с соотношением сторон 9:18 или 9: X также имеют ширину 1440 пикселей почти в каждом случае, если они превышают 1080. Ознакомьтесь с разрешениями последних выпущенных устройств.)

Таким образом, вы можете установить ширину в 1440 пикселей. Теперь высота вашего ImageView составляет 160dp. Который может быть (как предлагают все остальные) 160*4 = 640 px для самого большого DPI по умолчанию xxxhdpi. Причина, по которой вы должны учитывать высоту для стандартного dpis, потому что он установлен на some dp (160dp), и это может измениться для пользовательских устройств с разрешением dpi, поэтому вы можете поддерживать максимальное количество устройств с этим размером 640 пикселей. Надеюсь, у меня было ясное представление о размере.

0
Aaditya Brahmbhatt

Да, вам нужно будет сделать несколько изображений для экрана разных размеров, если вы не хотите использовать векторы и вместо этого хотите использовать изображения (png и т.д.). 

Так как у вас есть ширина как match_parent, в этом случае возьмите изображения с максимальной шириной экрана для сегментов различной плотности: -

MDPI -> 320 px
HDPI -> 480 px
XHDPI -> 640 px
XXHDPI -> 1080 px

Один dp - это единица виртуального пикселя, которая примерно равна одному пикселю на экране средней плотности (160 точек на дюйм; «базовая» плотность). 

Согласно приведенному выше утверждению, вы найдете высоту для изображений:

MDPI -> 160 px
HDPI -> 240 px
XHDPI -> 320 px
XXHDPI -> 480 px

Как рассчитать : -

Учтите, что 160 dp будет 160 пикселей в мдпи (1x).

160 dp   would be 240 px in hdpi (1.5x).

и так далее..

ИЛИ используя функцию px = dp * (dpi / 160)

Для HDPI dpi составляет 240

px = 160 * 240/160
px = 240

Список точек на дюйм см. это

Это помогло мне понять это и прояснить ситуацию

0
Kaveri

Это официальная таблица размеров, предоставленная Material Design Или вы можете запросить xxxhpdi, изображение которого основано на 1440 x 2960 px, и использовать этот сайт , чтобы получить все изображения с различной плотностью Когда вы получить изображения с различной плотностью, не нужно указывать высоту и ширину в макете px. Сохраните изображения с тем же именем и используйте match_parent. Android автоматически выберет изображение в соответствии с устройством.

0
Sambit Mallick

Вы можете отослать это

 ldpi: 270x120 px 
mdpi: 360x160 px
hdpi: 540x240 px
 xhdpi: 720x320 px
xxhdpi: 1280x480 px
 xxxhdpi: 1440x640 px
0
Syed Danish Haider