Если ваше изображение не зафиксировано указанным размером 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" />