Размер текста и различные размеры экрана android


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

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

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

но в 7IN WSVGA это выглядит так:

Я пытался использовать оба '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"/>

9 98

9 ответов:

@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 маленький, нормальный, большой и xlarge были осуждены с Android 3.2 в пользу следующего:

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

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

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

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

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

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

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

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

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

примеры: sw600dp sw720dp

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

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

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

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

примеры: w720dp w1024dp

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

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

примеры: h720dp h1024dp etc.

задает минимальную высоту экрана в единицах dp, при которой ресурсы должен использоваться-определяется значением. Система соответствует значение высоты изменяется при переключении ориентации экрана между пейзажем и портретом, чтобы отразить текущую фактическую высоту это доступно для вашего ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.

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

при использовании этих квалификаторов может показаться более сложным, чем с помощью размер экрана группы, это должно быть на самом деле проще, как только вы определяете требования к пользовательскому интерфейсу. Когда вы разрабатываете свой пользовательский интерфейс, главное вы, вероятно, заботитесь о том, является ли фактический размер, при котором ваше приложение переключение между телефонной трубкой-стиль пользовательского интерфейса и планшета-стиль пользовательского интерфейса, который использует несколько стекол. Точная точка этого переключателя будет зависеть от вашего особый дизайн-возможно, вам нужна ширина 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 # For 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 квалификаторы, если вам нужно быть действительно конкретным.

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

XML:

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

код:

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

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

  1. res / values-hdpi / dimens.xml
  2. res / values-xhdpi / dimens.xml
  3. res / values-xxhdpi / dimens.xml
  4. res / values-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, то в другом разрешении это будет

  1. hdpi: 12px
  2. xhdpi: 18px
  3. xxhdpi: 24px
  4. xxxhdpi: 36px

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

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

 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"/>

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

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

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

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

https://github.com/intuit/sdp

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

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

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

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

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

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

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

не Закодируйте размеры.

для гибкости объявления новых разрешений экрана-лучше всего разместить фиктивный 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 в качестве эталона, к которому можно добавить постоянное или размер percetage (путем расчета).

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