Сделать TextSize В соответствии с различными устройствами [duplicate]

У меня была аналогичная проблема с выводом расчета сверхурочных на работу. Значение должно всегда отображаться в HH: MM, даже если оно больше одного дня, и значение может стать отрицательным. Я объединил некоторые из представленных решений, и, возможно, кто-то еще найдет это решение полезным. Я понял, что если значение timedelta отрицательно, большинство представленных решений с использованием метода divmod не работают из коробки:

def td2HHMMstr(td):
  '''Convert timedelta objects to a HH:MM string with (+/-) sign'''
  if td < datetime.timedelta(seconds=0):
    sign='-'
    td = -td
  else:
    sign = ''
  tdhours, rem = divmod(td.total_seconds(), 3600)
  tdminutes, rem = divmod(rem, 60)
  tdstr = '{}{:}:{:02d}'.format(sign, int(tdhours), int(tdminutes))
  return tdstr

timedelta to HH: MM string:

td2HHMMstr(datetime.timedelta(hours=1, minutes=45))
'1:54'

td2HHMMstr(datetime.timedelta(days=2, hours=3, minutes=2))
'51:02'

td2HHMMstr(datetime.timedelta(hours=-3, minutes=-2))
'-3:02'

td2HHMMstr(datetime.timedelta(days=-35, hours=-3, minutes=-2))
'-843:02'
95
задан Axalo 23 June 2018 в 16:20
поделиться

10 ответов

139
ответ дан 030 17 August 2018 в 10:55
поделиться

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

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

-1
ответ дан Athlan 17 August 2018 в 10:55
поделиться

Я знаю, что поздно ответить, но тем не менее это может вам помочь!

Вам просто нужно установить размер текста на одном устройстве и запустить его, проверить, подходит ли он идеально. Скажем, это устройство xxxhdpi, и вы задали размер текста до 34sp. Вы можете использовать нижеприведенный код, чтобы получить размеры текста для других устройств, которые будут hdpi, xhdpi, xxhdpi.

import java.util.Scanner;
public class MyClass {
    public static void main(String args[]) {
        int resolutionSpValue = 0,whichRes = 1,resolution = 0;
        int hdpi = 4, xhdpi = 6, xxhdpi = 8, xxxhdpi = 12;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter sp value : ");
        resolutionSpValue = sc.nextInt();
        System.out.println("\n"+resolutionSpValue+"sp in which resolution : ");
        System.out.println("1. HDPI\n2. XHDPI\n3. XXHDPI\n4. XXXHDPI");
        whichRes = sc.nextInt();
        switch(whichRes){
            case 1:
                resolution = hdpi;
                break;
            case 2:
                resolution = xhdpi;
                break;
            case 3:
                resolution = xxhdpi;
                break;
            case 4:
                resolution = xxxhdpi;
                break;
        }
        getFinalValue(resolutionSpValue,resolution);
    }

    private static void getFinalValue(int resolutionSpValue,int whichResolution){
        final int hdpi = 4, xhdpi = 6, xxhdpi = 8, xxxhdpi = 12;
        int hd = 0, xhd = 0, xxhd = 0, xxxhd = 0,val = (resolutionSpValue/whichResolution);
        switch(whichResolution){
            case hdpi:
                xhd = xhdpi*val;
                xxhd = xxhdpi*val;
                xxxhd = xxxhdpi*val;
                System.out.println("\n\nHDPI : "+resolutionSpValue+"sp\nXHDPI : "+xhd+"sp\nXXHDPI : "+xxhd+"sp\nXXXHDPI : "+xxxhd+"sp");
                break;
            case xhdpi:
                hd = hdpi*val;
                xxhd = xxhdpi*val;
                xxxhd = xxxhdpi*val;
                System.out.println("\n\nHDPI : "+hd+"sp\nXHDPI : "+resolutionSpValue+"sp\nXXHDPI : "+xxhd+"sp\nXXXHDPI : "+xxxhd+"sp");
                break;
            case xxhdpi:
                hd = hdpi*val;
                xhd = xhdpi*val;
                xxxhd = xxxhdpi*val;
                System.out.println("\n\nHDPI : "+hd+"sp\nXHDPI : "+xhd+"sp\nXXHDPI : "+resolutionSpValue+"sp\nXXXHDPI : "+xxxhd+"sp");
                break;
            case xxxhdpi:
                hd = hdpi*val;
                xhd = xhdpi*val;
                xxhd = xxhdpi*val;
                System.out.println("\n\nHDPI : "+hd+"sp\nXHDPI : "+xhd+"sp\nXXHDPI : "+xxhd+"sp\nXXXHDPI : "+resolutionSpValue+"sp");
                break;
        }
    }
}

0
ответ дан Deepak S. Gavkar 17 August 2018 в 10:55
поделиться

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

-1
ответ дан Jacques Kammeyer 17 August 2018 в 10:55
поделиться

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

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

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

6
ответ дан kalan 17 August 2018 в 10:55
поделиться

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

XML:

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

Код:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));
8
ответ дан Kevin van Mierlo 17 August 2018 в 10:55
поделиться
  • 1
    Вы НЕ должны использовать dp для размера текста ... вместо этого используйте sp. – Yousha Aleayoub 14 September 2016 в 03:15
  • 2
    используйте sp для размера текста – Thinsky 22 November 2016 в 04:38

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

https://github.com/intuit/sdp

2
ответ дан Muhammad Maqsood 17 August 2018 в 10:55
поделиться

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

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/ практика / screens_support.html

2
ответ дан NguyenDat 17 August 2018 в 10:55
поделиться
  • 1
    Использовать res / values-small может быть лучше. – einverne 10 October 2016 в 06:37
  • 2
    одна из худших реализаций. мы должны поддерживать 5 макетов только для поддержки разных размеров? – SolidSnake 9 February 2018 в 07:14

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

  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. В любом запросе, пожалуйста, дайте мне знать. Надеюсь, это поможет людям.

8
ответ дан Rahul Sharma 17 August 2018 в 10:55
поделиться
  • 1
    Не плохая практика использовать px вместо sp в размере текста? Есть ли способ достичь следующего отношения, используя sp вместо px? – Red M 4 August 2018 в 17:32

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

  • Программно рассчитайте размер физического экрана других телефонов, т.е. 5'2 дюйма других телефонов / экранов.
  • Используйте формулу для вычисления процентной разницы между двумя экранами. т. е. какая разница между 4'6 и 5'2.
  • Рассчитайте разницу в пикселях между 2 TextViews на основе приведенной выше формулы.
  • Получите фактический размер (в пикселях) размера шрифта TextView и применить разность пикселей (вы рассчитали ранее) к размеру шрифта по умолчанию.

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

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

0
ответ дан SolidSnake 17 August 2018 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: