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

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

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

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

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

Доброе утро. Помогите пожалуйста раз и навсегда разобратся с размерами в андройде. Сейчас пытаюсь сделать одинаковое отображение шрифта на всех устройствах.
Создал 4 папки в них файл dimens и в файле размер, но не правильно что то отображается
value-ldpi - dimens - 22.5dp
value-hdpi - dimens - 45dp
value-mdpi - dimens - 30dp
value-xhdpi - dimens - 60dp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2014, 10:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно задать рамеры тексту? (Программирование Android):

Класс Date, как правильно задать дату? - Программирование Android
public class MainActivity extends ActionBarActivity { TextView Text; @Override protected void onCreate(Bundle...

Как получить доступ к тексту SMS? - Программирование Android
Тость хочу чтоб когда выскакивает меню набора текста SMS я мог бы туда при нажатие в какую - нибуть область или ещё как, пока это не важно,...

Как добавить обводку тексту? Java (XML) - Программирование Android
Необходимо добавить обводку текста в адроид студии. Какие параметры использовать для этого? Можно ли сделать это все в xml файле?

Как задать тексту возможное положение? - HTML, CSS
как исключить такое расположение текста

Как задать контролам автоматический размер по тексту? - VBA
С помощью этого кода создаются Option Button'ы: Public Sub CreateAnsw() Dim NCell As Integer, intHeight As Integer NCell = 2 ...

Как тексту задать цвет, шрифт и размер? - C++ WinAPI
Кто может поможет. Добавьте код, который бы изменял цвет и шрифт и размер текста. HWND hLabel; hLabel = CreateWindow(TEXT("STATIC"),...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 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
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 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
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 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:22
Привет! Вот еще темы с ответами:

Как задать определенное положение тексту или картинке - HTML, CSS
Всем привет нужно конкретный размер сделать как на фото как вообще делать в дивах? а текст br?

Как правильно обратиться к тексту? - JavaScript
есть 2 формы, внутри них лежат инпуты, лейблы и скрытый текст. &lt;label&gt;пароль:&lt;/label&gt;&lt;br&gt; &lt;input class=&quot;inputtxt&quot;...

Как правильно задать http запрос, если нужно задать reqest header? - Java Сети
В программе нужно перезагрузить роутер, исспользуя httpanalazer получилось определить какой запрос я должен отослать - он на фото ...

Задать отступ многострочному тексту - HTML, CSS
Всем привет. Подскажите пожалуйста, как сделать, что бы текс который идет после слова &quot;Поставщик&quot; не заходил под него, а переносился на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.08.2014, 11:22
Ответ Создать тему
Опции темы

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