проблема с макетом и помогите мне найти решение для масштабирования на всех устройствах

#android

#Android

Вопрос:

Мое изображение на каком-то устройстве просто отличное, но на каком-то маленьком телефоне с дисплеем положение изображения находится вне диапазона

Помогите мне, пожалуйста

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">

        <ImageView
            android:id="@ id/imageView6"
            android:layout_width="198dp"
            android:layout_height="182dp"
            android:layout_marginStart="107dp"
            android:layout_marginTop="77dp"
            android:layout_marginEnd="107dp"
            android:layout_marginBottom="472dp"
            android:src="@drawable/hi"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:contentDescription="@string/todo" />
</android.support.constraint.ConstraintLayout>
  

введите описание изображения здесь

Комментарии:

1. android:layout_width="198dp" android:layout_height="182dp" android:layout_marginStart="107dp" android:layout_marginTop="77dp" android:layout_marginEnd="107dp" android:layout_marginBottom="472dp" почему вы устанавливаете жестко заданные значения? это и есть главная причина.

Ответ №1:

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

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

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




<ImageView
    android:id="@ id/imageView6"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:contentDescription="todo"
    android:src="@drawable/common_full_open_on_phone"
    app:layout_constraintBottom_toTopOf="@ id/guideline2"
    app:layout_constraintEnd_toStartOf="@ id/guideline4"
    app:layout_constraintHorizontal_bias="1.0"
    app:layout_constraintStart_toStartOf="@ id/guideline5"
    app:layout_constraintTop_toTopOf="@ id/guideline3"
    app:layout_constraintVertical_bias="0.0" />

<androidx.constraintlayout.widget.Guideline
    android:id="@ id/guideline2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.6" />

<androidx.constraintlayout.widget.Guideline
    android:id="@ id/guideline3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.2"  />

<androidx.constraintlayout.widget.Guideline
    android:id="@ id/guideline4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.8" />

<androidx.constraintlayout.widget.Guideline
    android:id="@ id/guideline5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.2" />
  

Ответ №2:

Используйте эту библиотеку https://github.com/intuit/sdp. В нем представлена новая единица измерения масштаба под названием sdp (scalable dp), которая автоматически масштабирует ваши представления в зависимости от вашего устройства.

Ответ №3:

Использование dp непосредственно в макетах ухудшает ситуацию при разных размерах экрана.

вы можете использовать следующую библиотеку для придания компонентам гибкого размераhttps://github.com/intuit/sdp

и вы можете использовать размеры следующим образом :

 android:padding="@dimen/_8sdp
  

А для определения размеров текста используйте следующую библиотеку.
https://github.com/intuit/ssp

и используйте его для определения размера текста

 android:textSize="@dimen/_10ssp"
  

Ответ №4:

Замените ваш xml на этот код

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">


    <ImageView
            android:id="@ id/imageView6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/Hi"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.06"/>
</android.support.constraint.ConstraintLayout>
  

Комментарии:

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

Ответ №5:

измените код на это, и это произойдет приложение: layoutconstraintHorizontal_bias=»0.5″ приложение: layoutconstraintVertical_bias=»0.1″ введите описание изображения здесь

Ответ №6:

Просто удалите все поля и отступы (их предпочитают использовать для небольших подробных изменений в макете ограничений) и используйте их оба

приложение: layout_constraintHorizontal_bias=»0″ приложение: layout_constraintVertical_bias=»0″

Смещение используется для перемещения вашего изображения или вида по дисплею с шагом в %, поэтому оно использует дисплей устройства и применяет ваше изображение в соответствии с установленным вами смещением в%.

Поиграйте с ними, и вы найдете решение

Я думаю, 0,5 по горизонтали и 0,1 по вертикали будет вполне достаточно

Ваш ImageView может выглядеть примерно так

 <ImageView
        android:id="@ id/imageView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/Hi"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.1"
        app:layout_constraintHorizontal_bias="0.5"/>