Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
kirawa
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
#1

Как правильно задать рамеры тексту? - Android

29.08.2014, 10:04. Просмотров 1037. Ответов 15
Метки нет (Все метки)

Доброе утро. Помогите пожалуйста раз и навсегда разобратся с размерами в андройде. Сейчас пытаюсь сделать одинаковое отображение шрифта на всех устройствах.
Создал 4 папки в них файл dimens и в файле размер, но не правильно что то отображается
value-ldpi - dimens - 22.5dp
value-hdpi - dimens - 45dp
value-mdpi - dimens - 30dp
value-xhdpi - dimens - 60dp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
29.08.2014, 10:38     Как правильно задать рамеры тексту? #2
\res\values-ldpi\dimens.xml
XML
1
2
3
<resources>
    <dimen name="text_size">40dp</dimen> 
</resources>
\res\layout\main_activity.xml
XML
1
2
3
4
5
6
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
... 
    <TextView android:id="@+id/tvText1" 
        android:textSize="@dimen/text_size" /> 
.... 
</GridLayout>
kirawa
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
29.08.2014, 11:02  [ТС]     Как правильно задать рамеры тексту? #3
это то понятно, вопрос то в другом... Вопрос какие папки и какие размеры в файлах задавать. я создал покачто вот эти и отображается это все на разных устройствах ни так как хотелось бы
value-ldpi - dimens - 22.5dp
value-hdpi - dimens - 45dp
value-mdpi - dimens - 30dp
value-xhdpi - dimens - 60dp
Тоесть возможно я не правильно выставил здесь процентное соотноешение
Делал по картинки из оф доков..
Изображения
 
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
29.08.2014, 11:13     Как правильно задать рамеры тексту? #4
Размеры текста указываются в sp, не dp. Потому и не так отображает.
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:14     Как правильно задать рамеры тексту? #5
Для указания ширины, высоты и отступов View-элементов используются различные единицы измерения (ЕИ):

dp или dip - Density-independent Pixels. Абстрактная ЕИ, позволяющая приложениям выглядеть одинаково на различных экранах и разрешениях.

sp - Scale-independent Pixels. То же, что и dp, только используется для размеров шрифта в View элементах

pt - 1/72 дюйма, определяется по физическому размеру экрана. Эта ЕИ из типографии.

px – пиксел, не рекомендуется использовать т.к. на разных экранах приложение будет выглядеть по-разному.

mm – миллиметр, определяется по физическому размеру экрана

in – дюйм, определяется по физическому размеру экрана

Давайте разбираться, чем они отличаются друг от друга.

in, mm и pt – неизменны относительно друг друга. Всегда 1 in = 25,4 mm и 1 in = 72 pt. Это классические единицы измерения. Т.е. задаете, например, кнопке ширину = 1 in и она должна отобразиться шириной в один дюйм, независимо от разрешения и диагонали экрана.

Что такое px, думаю, тоже понятно. Если у вас есть устройство с экраном шириной 480 px и вы создали кнопку шириной 240 px, то эта кнопка займет в ширину ровно пол-экрана. Но если вы откроете ваше приложение на устройстве с экраном с меньшим разрешением, то соотношение изменится, например:
- если разрешение 320х240, ширина экрана = 240 px. Кнопка займет уже не пол-экрана в ширину, а весь экран
- если же разрешение 1280х800, ширина = 800 px. Кнопка опять же будет занимать в ширину не пол-экрана, а чуть меньше трети
Миниатюры
Как правильно задать рамеры тексту?  
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:14     Как правильно задать рамеры тексту? #6
А ведь экран приложения – это обычно не одна кнопка, а набор из многих элементов и все они будут расползаться или сжиматься на разных разрешениях. Поэтому использовать px при разработке НЕ рекомендуется.

Для того, чтобы избежать таких ситуаций на разных разрешениях рекомендуется использовать dp (и sp). Его можно определить, как масштабируемый px. За степень масштабируемости отвечает Screen Density. Это коэффициент, который используется системой для вычисления значения dp. На текущий момент есть 5 значений этого коэффициента:
- low (ldpi) = 0,75
- medium (mdpi) = 1
- tv (tvdpi) = 1,33
- high (hdpi) = 1,5
- extra high (xhdpi) = 2

Т.е. когда для экрана стоит режим mdpi, то 1 dp = 1 px. Т.е. кнопка шириной 100 dp будет выглядеть также как и кнопка шириной 100 px.

Если, например, у нас экран с низким разрешением, то используется режим ldpi. В этом случае 1 dp = 0,75 px. Т.е. кнопка шириной 100 dp будет выглядеть так же как кнопка шириной 75 px.

Если у нас экран с высоким разрешением, то используется режим hdpi или xhdpi. 1 dp = 1, 5 px или 2 px. И кнопка шириной 100 dp будет выглядеть так же как кнопка шириной 150 px или 200 px.

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

Рассмотрим пример. Предположим у нас есть три устройства (характеристики реальны и взяты из спецификаций):

HTC Wildfire S: 3,2 inch, 480x320 px, 180 dpi
HTC Desire: 3,7 inch, 800x480 px, 252 dpi
Samsung Galaxy Tab: 10 inch, 1280x800 px, 151 dpi

Я создам такой экран:
Миниатюры
Как правильно задать рамеры тексту?  
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:15     Как правильно задать рамеры тексту? #7
Это несколько кнопок, в которых ширина и размер шрифта определены с использованием разных единиц измерения. На каждой кнопке для наглядности я написал ее ширину (layout_width) и размер шрифта (textSize) через запятую. Обратите внимание, что ширина всех кнопок кроме последней одинакова. Так происходит потому, что 1 in = 72 pt = 25,4 mm в любом случае, а для данного экрана также 1 in = 252 px = 252 dp. Шрифты также везде одинаковы, т.к. размер шрифта по умолчанию равен 14 sp и в данном случае равен 14 px.

xml-код:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<Button 
android:id="@+id/button1" 
android:layout_height="wrap_content" 
android:layout_width="1in" 
android:text="1 inch, default"> 
</Button> 
<Button 
android:id="@+id/button2" 
android:layout_height="wrap_content" 
android:layout_width="72pt" 
android:text="72 pt, default"> 
</Button> 
<Button 
android:id="@+id/button3" 
android:layout_height="wrap_content" 
android:layout_width="25.4mm" 
android:text="25.4 mm, default"> 
</Button> 
<Button 
android:id="@+id/button4" 
android:layout_height="wrap_content" 
android:layout_width="252px" 
android:text="252 px, 14 px" 
android:textSize="14px"> 
</Button> 
<Button 
android:id="@+id/button5" 
android:layout_height="wrap_content" 
android:layout_width="252dp" 
android:textSize="14sp" 
android:text="252 dp, 14 sp"> 
</Button> 
<Button 
android:id="@+id/button6" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="wrap_content, default"> 
</Button> 
</LinearLayout>
Посмотрим, как это будет выглядеть на экранах других устройств:
Миниатюры
Как правильно задать рамеры тексту?  
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:16     Как правильно задать рамеры тексту? #8
Для всех экранов я поставил режим mdpi. Скриншоты экранов смасштабированы к одному размеру для наглядности. Надо понимать, что на самом деле диагонали экранов существенно отличаются, а наша цель – добиться, чтобы приложение выглядело одинаково на различных устройствах.

Мы видим, что на всех экранах 1 px остался равен 1 dp (т.к. режим mdpi). И in, pt и mm сохранили свои пропорции (1; 72; 25,4) относительно друг друга. Но обратите внимание, что 1 in уже не равен 252 px на экранах Wildfire и Galaxy. Это потому, что у этих устройств другое соотношение диагонали экрана и разрешения:
- у Wildfire экран с dpi = 180, т.е. 1 in = 180 px, поэтому первая кнопка (с шириной = 1 inch) теперь короче, чем кнопка с шириной 252 px.
- для Galaxy, соответственно, dpi = 151.

Видно, что приложение выглядит достаточно по разному на трех экранах. Так было бы, если бы не существовало коэфициента Screen Density. Но он есть и давайте смотреть, чем он полезен. Я включу режим ldpi для Wildfire и xhdpi для Galaxy. Desire оставляю в mdpi.
Миниатюры
Как правильно задать рамеры тексту?  
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:16     Как правильно задать рамеры тексту? #9
Ширина кнопок указанная в in, mm, pt неизменна, на эти единицы измерения режимы Density влияния не имеют. Нам интересны четвертая и пятая кнопки. Видим, что на экранах Wildfire и Galaxy отличаются размеры px и dp, т.к. мы сменили mdpi на ldpi и xhdpi. Для Wildfire 1 dp стал равен 0,75 px, а для Galaxy 1 dp = 2 px. Также видим, что изменился шрифт на кнопках, где размер шрифта был указан по умолчанию или в sp-единицах. Он так же, как и dp смасштабировался благодаря Density режимам. А шрифт, размер которого был указан в px (четвертая кнопка) оставался неизменным и на Wildfire выглядит крупным, а на Galaxy – мелким.

Отлично видно, что адекватнее всего перенос на другие экраны перенесли пятая и шестая кнопки. Для пятой кнопки используются dp и sp. Для шестой кнопки – ширина = wrap_content и размер шрифта по умолчанию. А кнопки с in, mm, pt и px статичны и на разных экранах выглядят по-разному. Наверняка, есть случаи, когда необходимо использовать именно эти единицы измерения. Но в основном старайтесь использовать dp (для ширины, высоты и т.д.) и sp (для размера шрифта).

Конечно Density не дает масштабирования абсолютно пропорциального разнице в разрешениях экрана. Погрешность есть, но она невелика и является вполне приемлемой платой за способность приложения «сохранять форму» на разных устройствах.

Кем именно устанавливаются Density режимы для различных экранов – я не знаю. Но подозреваю, что производителями устройств/экранов. Еще мне интересно, можно ли эти режимы переключать при работе устройства. Думаю, чуть позже я найду ответы на эти вопросы.

Для создания этого материала я использовал различные конфигурации экранов, которые можно создавать самому:
Миниатюры
Как правильно задать рамеры тексту?  
kirawa
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
29.08.2014, 11:17  [ТС]     Как правильно задать рамеры тексту? #10
ну и что, я что пикселы использую?????????????????????????????????
Цитата Сообщение от kirawa Посмотреть сообщение
value-ldpi - dimens - 22.5dp
value-hdpi - dimens - 45dp
value-mdpi - dimens - 30dp
value-xhdpi - dimens - 60dp
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:17     Как правильно задать рамеры тексту? #11
Вы наверно обратили внимание, что в папке Андроид-проекта в Eclipse есть папки drawable c суффиксами hdpi, ldpi, mdpi:
Папка drawable используется для хранения изображений, а суффиксы дают понять системе из какой именно drawable использовать картинки при текущем Density режиме. Подробнее об этом можно почитать в хелпе. Кстати, там же вы найдете уже изученный нами –land, который связан с горизонтальной ориентацией экрана. Будем по мере изучения Андроид знакомиться с остальными.
Изображения
 
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
29.08.2014, 11:18     Как правильно задать рамеры тексту? #12
Цитата Сообщение от kirawa Посмотреть сообщение
ну и что, я что пикселы использую?
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Размеры текста указываются в sp, не dp. Потому и не так отображает.
Хоть не пиксели, но неверно.
semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 177
29.08.2014, 11:20     Как правильно задать рамеры тексту? #13
kirawa, Думал эта информация может быть поможет решить Вашу проблему.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
29.08.2014, 11:21     Как правильно задать рамеры тексту? #14
И зачем вообще использовать разные размеры в dp для разных экранов? dp для того и придумали чтобы не подгонять размеры под каждый экран. Поставьте просто для всех экранов один размер в sp. Результат вас удивит)
kirawa
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
29.08.2014, 11:22  [ТС]     Как правильно задать рамеры тексту? #15
Spelcrawler ты не прав, ну ну то что размеры то шрифта указываются в sp это да
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2014, 11:24     Как правильно задать рамеры тексту?
Еще ссылки по теме:

Android Как задать координаты анимации
Как задать относительный размер ImageView? Android
Android Класс Date, как правильно задать дату?
Как добавить обводку тексту? Java (XML) Android
Как у TextView задать текст? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
29.08.2014, 11:24     Как правильно задать рамеры тексту? #16
Цитата Сообщение от kirawa Посмотреть сообщение
Spelcrawler ты не прав
Но почему-то мои приложения одинаково отображаются на всех устройствах от самых маленьких телефонов до планшетов. Будь то текст или вьюшка. Рекомендую проверить.
Yandex
Объявления
29.08.2014, 11:24     Как правильно задать рамеры тексту?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru