Размер текста и различные размеры экрана для Android

Я знаю, это обсуждалось уже 1000 раз, но я не могу настроить размер текста для разных размеров экрана. Я пытаюсь использовать 'sp' в качестве единиц измерения в моем собственном стиле:

<style name="CustumButtonStyle" parent="@android:style/Widget.Button">
    ...
    <item name="android:textSize">30sp</item>
    ...
</style>

В 2.7 QVGA это выглядит нормально:

2.7QVGA 30sp

Но в 7in WSVGA это выглядит так:

7in WSVGA 30sp

Я пытался использовать оба "sp" и "dp" с тем же результатом.

Не могли бы вы объяснить, как заставить эти кнопки выглядеть одинаково на любом экране?

Полный пользовательский стиль кнопок

<style name="CustumButtonStyle" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/custom_button</item>
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_margin">3dp</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:gravity">center</item>
    <item name="android:textSize">30sp</item>
    <item name="android:textStyle">bold</item>
    <item name="android:shadowColor">#000000</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">2</item>
</style>

И в моей теме приложения у меня есть

<item name="android:buttonStyle">@style/CustumButtonStyle</item>

И есть мой макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="fill_parent"
android:background="@drawable/grid"
android:gravity="center"
android:orientation="vertical" android:layout_height="fill_parent">

<Button
    android:id="@+id/buttonContinue"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/continue_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>



<Button
    android:id="@+id/buttonNewGame"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/buttonContinue"
    android:layout_alignRight="@+id/buttonContinue"
    android:layout_below="@+id/buttonContinue"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/new_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>



<Button
    android:id="@+id/ButtonAbout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/buttonNewGame"
    android:layout_alignRight="@+id/buttonNewGame"
    android:layout_below="@+id/buttonNewGame"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/about" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>

Ответ 1

@forcelain Я думаю, вам нужно проверить этот Google IO Pdf для дизайна. В этом pdf перейдите на страницу №: 77, в которой вы найдете, как предлагалось использовать dimens.xml для разных устройств android для примера, см. Ниже структуру:

res/values/dimens.xml

res/values-small/dimens.xml

res/values-normal/dimens.xml

res/values-large/dimens.xml

res/values-xlarge/dimens.xml

для примера, который вы использовали ниже dimens.xml в значениях.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">18sp</dimen>
</resources>

В другой папке значений вам нужно изменить значения для вашего размера текста.

Примечание.. Как указано в @espinchi, с Android 3.2 были отменены малые, нормальные, большие и xlarge в пользу:

Объявление макетов планшета для Android 3.2

Для первого поколения планшетов, работающих под управлением Android 3.0, способ объявить планшеты планшета должен был помещать их в каталог с xlarge (например, res/layout-xlarge/). В для размещения других типов таблеток и размеров экрана в в частности, 7-дюймовые планшеты - Android 3.2 представляет новый способ указания ресурсов для более дискретных размеров экрана. Новая методика основана на на объем пространства, необходимого вашему макету (например, 600dp ширины) вместо того, чтобы пытаться сделать ваш макет подходящим для групп обобщенного размера (например, большой или большой).

Причина разработки для 7-дюймовых планшетов сложна при использовании обобщенные группы размеров - это то, что 7-дюймовый планшет технически в одном и том же группы в качестве 5-дюймовой трубки (большая группа). Хотя эти два устройства кажущиеся близкими друг к другу по размеру, объем пространства для пользовательский интерфейс приложения существенно отличается, как и стиль пользователя взаимодействие. Таким образом, экран 7 "и 5" не всегда должен использовать один и тот же раскладка. Чтобы вы могли предоставить различные макеты для эти два вида экранов, Android теперь позволяет вам указать свой ресурсы макета на основе ширины и/или высоты, которые фактически доступный для вашего макета приложения, указанный в единицах dp.

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

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

Примечание. Помните, что все цифры, используемые с этими API-интерфейсами нового размера, значения плотности пикселей (dp) и размеры макета также всегда следует определять с помощью единиц dp, потому что то, что вам нужно about - количество пространства экрана, доступного после системы учитывает плотность экрана (в отличие от использования необработанного пикселя разрешающая способность). Для получения дополнительной информации о независимых по плотности пикселей, читать термины и понятия, ранее в этом документе. Использование нового размера классификаторы

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

Примечание. Размеры, указанные вами с помощью этих классификаторов, не являются фактические размеры экрана. Скорее, размеры для ширины или высоты в dp, которые доступны для вашего окна активности. Android система может использовать некоторый экран для пользовательского интерфейса системы (например, системы в нижней части экрана или в строке состояния вверху), поэтому некоторые экрана может быть недоступна для вашего макета. Таким образом, размеры вы заявляете, что должны быть конкретно о размерах, необходимых вашему activity - система учитывает любое пространство, используемое системным интерфейсом, когда объявив, сколько места он предоставляет для вашего макета. Также будьте осторожны, панель действий считается частью окна вашего приложения пространство, хотя ваш макет не объявляет его, поэтому он уменьшает доступное для вашего макета, и вы должны учитывать его в своем дизайн.

Таблица 2. Новые квалификаторы конфигурации для размера экрана (введены в Android 3.2). Конфигурация экрана Значения классификатора Описание smallestWidth swdp

Примеры: sw600dp sw720dp

Фундаментальный размер экрана, о чем свидетельствует кратчайший размер доступной области экрана. В частности, smallestWidth - это самая короткая из доступных на экране высота и ширину (вы также можете думать об этом как о "минимально возможной ширине" для экран). Вы можете использовать этот квалификатор, чтобы гарантировать, что независимо от текущая ориентация экрана, ваше приложение, по крайней мере, dps ширины, доступной для его пользовательского интерфейса.

Например, если ваш макет требует, чтобы его наименьшее измерение площадь экрана должна быть не менее 600 dp в любое время, тогда вы можете использовать эту квалификатор для создания ресурсов макета, res/layout-sw600dp/. система будет использовать эти ресурсы только тогда, когда наименьшее измерение доступный экран составляет не менее 600dp, независимо от того, будет ли 600dp сторона - это воспринимаемая пользователем высота или ширина. Наименьшая ширина - это фиксированный размер экрана, характерный для устройства; устройства smallestWidth не изменяется при изменении ориентации экрана.

Наименьшая ширина устройства учитывает декорации экрана и пользовательский интерфейс системы. Например, если устройство имеет некоторый постоянный пользовательский интерфейс элементы на экране, которые учитывают пространство вдоль оси smallestWidth, система объявляет наименьшую ширину меньше чем фактический размер экрана, потому что это пиксели экрана, а не доступный для вашего пользовательского интерфейса.

Это альтернатива обобщенным спецификаторам размера экрана (маленький, нормальный, большой, xlarge), который позволяет вам определить дискретный номер для эффективного размера, доступного для вашего пользовательского интерфейса. С помощью smallestWidth для определения общего размера экрана полезен, потому что ширина часто является движущей силой при проектировании макета. Пользовательский интерфейс часто прокручиваются по вертикали, но имеют довольно жесткие ограничения на минимальное пространство, которое требуется горизонтально. Доступная ширина также ключевым фактором при определении того, следует ли использовать однопанельный макет для планшеты или многоуровневую компоновку для планшетов. Таким образом, вы, вероятно, о том, какая минимально возможная ширина будет на каждом устройстве. Доступная ширина экрана wdp

Примеры: w720dp w1024dp

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

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

Примеры: h720dp h1024dp и т.д.

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

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

Использование этих квалификаторов может показаться более сложным, чем использование группы размера экрана, на самом деле это будет проще, если вы определите требования к вашему пользовательскому интерфейсу. Когда вы разрабатываете свой интерфейс, главное вы, вероятно, заботитесь о фактическом размере, при котором ваше приложение переключается между пользовательским интерфейсом в стиле телефонной трубки и пользовательским интерфейсом в стиле планшета, который использует несколько окон. Точная точка этого переключателя будет зависеть от вашего конкретный дизайн - возможно, вам нужна ширина 720dp для вашего планшета планшета, возможно, 600dp, или 480dp, или некоторое число между ними. С помощью эти квалификаторы в таблице 2, вы контролируете точный размер на который изменяется ваш макет.

Подробнее об этих классификаторах конфигурации размера см. Предоставление ресурсов. Примеры конфигурации

Чтобы помочь вам настроить некоторые из ваших проектов для разных типов устройства, вот некоторые цифры для типичной ширины экрана:

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
480dp: a tweener tablet like the Streak (480x800 mdpi).
600dp: a 7" tablet (600x1024 mdpi).
720dp: a 10" tablet (720x1280 mdpi, 800x1280 mdpi, etc).

Используя квалификаторы размеров из таблицы 2, ваше приложение может переключаться между различными ресурсами раскладки для телефонов и планшетов, используя любое число, которое вы хотите для ширины и/или высоты. Например, если 600dp наименьшая доступная ширина, поддерживаемая вашим планшетом планшета, вы можете эти два набора макетов:

res/layout/main_activity.xml # Для мобильных телефонов res/layout-sw600dp/main_activity.xml # Для таблеток

В этом случае минимальная ширина доступного пространства экрана должна быть 600dp, чтобы план табло был применен.

В других случаях, когда вы хотите изменить пользовательский интерфейс различают размеры, такие как 7 "и 10" таблетки, вы можете определить дополнительные макеты минимальной ширины:

res/layout/main_activity.xml # Для телефонов (меньше 600dp доступная ширина) res/layout-sw600dp/main_activity.xml # Для 7 "планшеты (600dp в ширину и больше) res/layout-sw720dp/main_activity.xml

Для 10-дюймовых планшетов (720dp в ширину и больше)

Обратите внимание, что предыдущие два набора примеров ресурсов используют" наименьшая ширина ", swdp, которая определяет наименьшую из экран с двух сторон, независимо от тока устройства ориентации. Таким образом, использование swdp - это простой способ указать общий размер экрана, доступный для вашего макета, игнорируя экран ориентации.

Однако, в некоторых случаях, что может быть важно для вашего макета, точно, сколько ширины или высоты в настоящее время доступно. Например, если у вас есть двухпанельный макет с двумя фрагментами бок о бок, вы может захотеть использовать его всякий раз, когда экран обеспечивает не менее 600dp ширина, независимо от того, находится ли устройство в альбомной или портретной ориентации. В этот случай, ваши ресурсы могут выглядеть так:

res/layout/main_activity.xml # Для телефонов (меньше 600dp доступная ширина) res/layout-w600dp/main_activity.xml # Мультипанель (любой экран с доступной шириной 600dp или более)

Обратите внимание, что второй набор использует квалификатор" доступной ширины", WDP. Таким образом, одно устройство может фактически использовать оба макета, в зависимости от по ориентации экрана (если доступная ширина не меньше 600dp в одной ориентации и менее 600dp в другой ориентация).

Если доступная высота вызывает у вас беспокойство, вы можете сделать то же самое используя квалификатор hdp. Или даже объедините wdp и hdp если вам нужно быть конкретным.

Ответ 2

Я думаю, что слишком поздно ответить на эту тему. Но я хотел бы поделиться своей идеей или способом разрешения проблемы с размером текста в устройствах с разностным разрешением. Многие сайты разработчиков Android предлагают использовать sp блок для размера текста, который будет обрабатывать размер текста для устройств с разностным разрешением. Но я всегда не могу получить желаемый результат. Поэтому я нашел одно решение, которое я использую из своих последних 4-5 проектов и его работы. Согласно моему предложению, вы должны поместить размер текста для каждого устройства разрешения, что немного утомительно, но оно выполнит ваше требование. Каждый разработчик должен прослушивать соотношение как 4: 6: 8: 12 (h: xh: xxh: xxxh соответственно). Теперь в папке res вашего проекта вы должны создать 4 папки с размером файла, например.

  • RES/значение-ИПЧР/dimens.xml
  • RES/значения-xhdpi/dimens.xml
  • RES/значения-xxhdpi/dimens.xml
  • RES/значения-xxxhdpi/dimens.xml

Теперь в файле dimens.xml вам нужно поместить размеры текста. Я показываю вам код для значений-hdpi, аналогичным образом вам нужно поместить код для других значений разрешения /dimens.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">4px</dimen>
</resources>

Для других разрешений это похоже на xhdpi: 6px, xxhdpi: 8px, xxxhdpi: 12px. Это рассчитано с соотношением (3: 4: 6: 8: 12), которое я написал выше. Давайте обсудим другой пример размера текста с приведенным выше соотношением. Если вы хотите взять размер текста 12px в hdpi, то в другом разрешении это будет

  • hdpi: 12px
  • xhdpi: 18px
  • xxhdpi: 24px
  • xxxhdpi: 36px

Это простое решение для реализации требуемого размера текста для всех разрешений. Я не рассматриваю здесь устройства значения-mdpi. Если кто-то хочет включить размер текста для этого разрешения, то рацион похож на 3: 4: 6: 8: 12. В любом запросе, пожалуйста, дайте мне знать. Надеюсь, это поможет людям.

Ответ 3

Иногда лучше иметь только три варианта

 style="@android:style/TextAppearance.Small"

Используйте маленькие и большие, чтобы отличать нормальный размер экрана.

<TextView
            android:id="@+id/TextViewTopBarTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/TextAppearance.Small"/>

Для нормального вам ничего не нужно указывать.

<TextView
            android:id="@+id/TextViewTopBarTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

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

Ответ 4

Я делал то же самое по размеру и рисовал что-то вроде (с dp, но только для текста и в drawText())

XML:

   <dimen name="text_size">30sp</dimen>

код:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));

Ответ 5

Каждый может использовать упомянутую ниже библиотеку Android, которая является самым простым способом сделать размеры текста совместимыми практически со всеми экранами устройств. Он фактически разработан на основе новых квалификаторов конфигурации Android для размера экрана (представлен в Android 3.2) SmallestWidth swdp.

https://github.com/intuit/sdp

Ответ 6

Я думаю, вы можете архивировать это, добавив несколько ресурсов макета для каждого размера экрана, например:

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size with small text
res/layout-large/my_layout.xml       // layout for large screen size with larger text
res/layout-xlarge/my_layout.xml      // layout for extra large screen size with even larger text
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

Справка: 1. http://developer.android.com/guide/practices/screens_support.html

Ответ 7

Чтобы объединить все экраны для отображения одинаковых размеров элементов, включая размер шрифта: - Создайте пользовательский интерфейс на одном размере экрана с любыми размерами, которые вы сочтете подходящими во время разработки, т.е. размер шрифта TextView составляет 14 дп при размере экрана по умолчанию с 4,6 дюйма.

  • Программно рассчитать физический размер экрана других телефонов, то есть 5,2 дюйма других телефонов/экранов.

  • Используйте формулу для расчета процентной разницы между двумя экранами. т.е. какая разница в% между 4'6 и 5'2.

  • Рассчитайте разницу в пикселях между двумя TextViews на основе приведенной выше формулы.

  • Получите фактический размер (в пикселях) шрифта TextView и примените разницу в пикселях (которую вы рассчитывали ранее) к размеру шрифта по умолчанию.

Таким образом, вы можете применить динамическое соотношение сторон ко всем размерам экрана, и результат будет отличным. У вас будет одинаковое расположение и размеры на каждом экране.

Сначала это может быть немного сложно, но вы полностью достигнете цели, как только вы определитесь с формулой. С этим методом вам не нужно делать несколько макетов, просто чтобы соответствовать разным размерам экрана.

Ответ 8

Вы также можете использовать weightSum и layout_weight для настройки вашего другого экрана.

Для этого вы должны сделать android:layout_width= 0dp, и android:layout_width= (все, что вы хотите);

Ответ 9

Если у вас есть API 26, вы можете использовать autoSizeTextType:

<Button
  app:autoSizeTextType="uniform" />

Настройка по умолчанию позволяет автоматически изменять размер TextView по горизонтальной и вертикальной осям.

https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview

Ответ 10

Не печатайте размеры жесткого диска.

Для гибкости объявление новых разрешений экрана - лучше всего поместить фиктивный TextView в макет, чтобы получить textSize:

<TextView
        android:id="@+id/dummyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="TextView" />

И в вашем коде, например:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView);
float textSize = testTextView.getTextSize();

Храните textSize в качестве ссылки, к которой вы можете добавить постоянный или размер перкота (путем вычисления).

Ответ 11

Как отмечают @espinchi из 3.2 (API уровня 13), группы размеров устарели. Диапазоны размеров экрана - предпочтительный подход в будущем.