Как сохранить размер текста в TextView одинаковым для разных размеров экрана и плотности? - PullRequest
0 голосов
/ 27 марта 2020

Я прочитал много вопросов и ответов, и ни один из них не сработал. Они были, скорее всего, устаревшими. Конечно, есть простое решение этого. Я разрабатываю пользовательский интерфейс с фоном c изображения (который хорошо масштабируется на всех устройствах, несмотря на отсутствие сегментов плотности) с разметкой TextViews на фоне (см. Фото).

  1. Внешний вид штраф:

looks fine

Не очень хорошо выглядит:

does not look fine

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

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    tools:context=".Main2Activity">

    <TextView
        android:id="@+id/mpView"
        android:layout_width="wrap_content"
        android:layout_height="0sp"
        android:layout_marginTop="208dp"
        android:layout_marginEnd="52dp"
        android:autoSizeTextType="none"
        android:onClick="mpRanges"
        android:text="@string/mp"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/centreDot"
        app:layout_constraintTop_toTopOf="@+id/centreDot" />

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Если ваше изображение не зафиксировано указанным размером c в dp, вы не можете установить позицию TextView с фиксированным значением dp.

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

На одном устройстве ширина экрана составляет 200 dp, поэтому изображение в 100px масштабируется до 200 dp. На другом устройстве ширина дисплея составляет 400dp, поэтому 100px масштабируется до 400dp. Теперь давайте посчитаем центр изображения в dp: в первом случае это 100dp, а во втором - 200dp! Вот почему вы не можете заставить его хорошо выглядеть на всех устройствах.

Чтобы исправить это, вам нужно создать собственную ViewGroup (может быть дочерней по отношению к FrameLayout). Во время выполнения вы сможете получить реальный размер изображения и рассчитать позиции для всех TextViews относительно вашего изображения. Кажется, вам даже не нужно реализовывать onMeasure () и onDraw (), просто onLayout ().

Официальная документация для создания пользовательских видов: https://developer.android.com/guide/topics/ui/custom-components. Но, может быть, вы найдете статьи с лучшими объяснениями, прибегая к помощи "android create custom viewgroup" или что-то подобное.

-

Я все еще предпочитаю свой первый ответ, но добавлю еще один: возможно, вы сможете делать то, что вам нужно, с позиционированием в процентах в ConstraintLayout. Вы можете создать Руководство для каждой точки на вашем изображении (как вертикальной, так и горизонтальной) с layout_constraintGuide_percent и прикрепить к нему TextView. 0,2 и 0,5 - замените эти значения процентным положением центра ваших точек на изображении.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gd1"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.2" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gd2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="@id/gd1"
    app:layout_constraintEnd_toEndOf="@id/gd2"
    app:layout_constraintStart_toStartOf="@id/gd2"
    app:layout_constraintTop_toTopOf="@id/gd1" />
0 голосов
/ 28 марта 2020

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

...