Android 与适应多种手机屏幕尺寸有关的困难

Android 与适应多种手机屏幕尺寸有关的困难,android,android-layout,Android,Android Layout,我目前正在开发一个应用程序,并试图允许它支持多种手机屏幕尺寸(它将不支持任何大于谷歌像素3XL的尺寸)。另外,为了上下文,我使用了ConstraintLayout 对于布局的背景,我使用了一个图像。在背景之上,我精心放置了可交互的元素,以匹配它们在背景上应该对应的位置。然而,这并不能很好地在所有显示器上进行转换,因为布局元素和背景会扭曲和错位。我的解决方案是尝试根据分辨率为手机制作不同的布局(为屏幕尺寸为1080x1920、1080x2160、1440x2560、1440x2880、1440x2

我目前正在开发一个应用程序,并试图允许它支持多种手机屏幕尺寸(它将不支持任何大于谷歌像素3XL的尺寸)。另外,为了上下文,我使用了ConstraintLayout

对于布局的背景,我使用了一个图像。在背景之上,我精心放置了可交互的元素,以匹配它们在背景上应该对应的位置。然而,这并不能很好地在所有显示器上进行转换,因为布局元素和背景会扭曲和错位。我的解决方案是尝试根据分辨率为手机制作不同的布局(为屏幕尺寸为1080x1920、1080x2160、1440x2560、1440x2880、1440x2960的手机制作了布局)

然而,这些似乎并不自动适用于我测试过的任何设备。我假设这是因为手机没有任何规格,这只适用于平板电脑、手表等。我最近刚想把我的UI中的所有内容都转移到我的布局中,并使用ImageView实现所有内容,但这也不起作用,因为当手机 屏幕大小改变,所有元素在屏幕中失去正确的位置。为了让我的应用程序适应所有的屏幕尺寸,我已经尝试了几乎所有的方法,但想不出还有什么可以做的

我将提供一个更复杂的布局供参考。真的希望在这件事上能得到一些帮助。谢谢

布局

<?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:orientation="vertical"
    android:background="@drawable/a1440x2960_tt">


    <TextView
        android:id="@+id/display"
        android:layout_width="wrap_content"
        android:layout_height="74dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="152dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:fontFamily="@font/freesansbold"
        android:text="00 : 00 . 00"
        android:textColor="@color/black"
        android:textSize="60dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/resetbtn"
        android:layout_width="83dp"
        android:layout_height="34dp"
        android:layout_marginStart="268dp"
        android:layout_marginLeft="268dp"
        android:layout_marginTop="264dp"
        android:background="@color/transparent"
        android:stateListAnimator="@null"
        android:textAllCaps="false"
        android:textColor="@color/stopbtn"
        android:textSize="20dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/pausebtn"
        android:layout_width="92dp"
        android:layout_height="35dp"
        android:layout_marginStart="156dp"
        android:layout_marginLeft="156dp"
        android:layout_marginTop="264dp"
        android:background="@color/transparent"
        android:stateListAnimator="@null"
        android:textAllCaps="false"
        android:textColor="@color/stopbtn"
        android:textSize="20dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <EditText
        android:id="@+id/goalMinutes"
        android:layout_width="96dp"
        android:layout_height="66dp"
        android:layout_marginStart="48dp"
        android:layout_marginLeft="48dp"
        android:layout_marginTop="156dp"
        android:background="@null"
        android:fontFamily="@font/freesansbold"
        android:inputType="numberPassword"
        android:text="00"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="50dp"
        app:layout_constraintStart_toStartOf="@+id/splashdebugoutput"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/goalMilli"
        android:layout_width="93dp"
        android:layout_height="66dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="156dp"
        android:background="@null"
        android:fontFamily="@font/freesansbold"
        android:inputType="numberPassword"
        android:text="00"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="50dp"
        app:layout_constraintStart_toStartOf="@+id/goal_dot"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/goalSeconds"
        android:layout_width="82dp"
        android:layout_height="66dp"
        android:layout_marginTop="156dp"
        android:background="@null"
        android:fontFamily="@font/freesansbold"
        android:inputType="numberPassword"
        android:text="00"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="50dp"
        app:layout_constraintStart_toEndOf="@+id/goal_colon2"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/goal_dot"
        android:layout_width="16dp"
        android:layout_height="67dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="156dp"
        android:fontFamily="@font/product_bold"
        android:text="."
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="50dp"
        app:layout_constraintStart_toEndOf="@+id/goalSeconds"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/goal_colon"
        android:layout_width="18dp"
        android:layout_height="43dp"
        android:layout_marginStart="28dp"
        android:layout_marginLeft="28dp"
        android:layout_marginTop="457dp"
        android:fontFamily="@font/product_bold"
        android:text=":"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="24dp"
        app:layout_constraintStart_toStartOf="@+id/tempoSeconds"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/goal_colon2"
        android:layout_width="16dp"
        android:layout_height="67dp"
        android:layout_marginTop="152dp"
        android:fontFamily="@font/product_bold"
        android:text=":"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textSize="50dp"
        app:layout_constraintStart_toEndOf="@+id/goalMinutes"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/minmarker"
        android:layout_width="15dp"
        android:layout_height="21dp"
        android:layout_marginStart="42dp"
        android:layout_marginLeft="42dp"
        android:layout_marginTop="64dp"
        android:fontFamily="@font/product_regular"
        android:text="M"
        android:textColor="@color/black"
        android:textSize="17dp"
        app:layout_constraintStart_toStartOf="@+id/goalMinutes"
        app:layout_constraintTop_toTopOf="@+id/goalMinutes" />

    <TextView
        android:id="@+id/secmarker"
        android:layout_width="12dp"
        android:layout_height="20dp"
        android:layout_marginStart="148dp"
        android:layout_marginLeft="148dp"
        android:layout_marginTop="64dp"
        android:fontFamily="@font/product_regular"
        android:text="S"
        android:textColor="@color/black"
        android:textSize="17dp"
        app:layout_constraintStart_toStartOf="@+id/goalMinutes"
        app:layout_constraintTop_toTopOf="@+id/goalMinutes" />

    <TextView
        android:id="@+id/millimarker"
        android:layout_width="27dp"
        android:layout_height="19dp"
        android:layout_marginStart="246dp"
        android:layout_marginLeft="246dp"
        android:layout_marginTop="64dp"
        android:fontFamily="@font/product_regular"
        android:text="MS"
        android:textColor="@color/black"
        android:textSize="17dp"
        app:layout_constraintStart_toStartOf="@+id/goalMinutes"
        app:layout_constraintTop_toTopOf="@+id/goalMinutes" />

    <TextView
        android:id="@+id/splashdebugoutput"
        android:layout_width="wrap_content"
        android:layout_height="37dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Spinner
        android:id="@+id/course"
        android:layout_width="118dp"
        android:layout_height="36dp"
        android:layout_marginTop="56dp"
        android:layout_marginEnd="233dp"
        android:layout_marginRight="233dp"
        android:background="@color/transparent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/resetbtn"></Spinner>

    <Spinner
        android:id="@+id/length"
        android:layout_width="118dp"
        android:layout_height="38dp"
        android:layout_marginTop="56dp"
        android:layout_marginEnd="68dp"
        android:layout_marginRight="68dp"
        android:background="@color/transparent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/resetbtn"></Spinner>

    <Button
        android:id="@+id/startbtn"
        android:layout_width="86dp"
        android:layout_height="35dp"
        android:layout_marginTop="40dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:background="@color/transparent"
        app:layout_constraintEnd_toStartOf="@+id/pausebtn"
        app:layout_constraintHorizontal_bias="0.741"
        app:layout_constraintStart_toStartOf="@+id/splashdebugoutput"
        app:layout_constraintTop_toBottomOf="@+id/goalMinutes" />

    <EditText
        android:id="@+id/tempoSeconds"
        android:layout_width="30dp"
        android:layout_height="47dp"
        android:layout_marginStart="68dp"
        android:layout_marginLeft="68dp"
        android:layout_marginTop="448dp"
        android:backgroundTint="@color/black"
        android:maxLength="1"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="0"
        android:inputType="numberPassword"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/texthint"
        android:textSize="15dp"
        android:verticalScrollbarPosition="right"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/tempoMilliTens"
        android:layout_width="29dp"
        android:layout_height="48dp"
        android:layout_marginTop="448dp"
        android:backgroundTint="@color/black"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="0"
        android:inputType="numberPassword"
        android:maxLength="1"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/texthint"
        android:textSize="15dp"
        app:layout_constraintStart_toEndOf="@+id/goal_colon"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/tempoMilliHundreds"
        android:layout_width="30dp"
        android:layout_height="48dp"
        android:layout_marginTop="448dp"
        android:backgroundTint="@color/black"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="0"
        android:maxLength="1"        android:inputType="numberPassword"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/texthint"
        android:textSize="15dp"
        app:layout_constraintStart_toEndOf="@+id/tempoMilliTens"
        app:layout_constraintTop_toTopOf="parent" />

    <CheckBox
        android:id="@+id/splitAuto"
        android:layout_width="174dp"
        android:layout_height="26dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="56dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:button="@color/transparent"
        android:background="@null"
        android:scaleX="1.35"
        android:scaleY="1.35"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/course" />

    <CheckBox
        android:id="@+id/splitManual"
        android:layout_width="174dp"
        android:layout_height="26dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:button="@color/transparent"
        android:scaleX="1.35"
        android:background="@null"
        android:scaleY="1.35"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/splitAuto" />


    <ImageView
        android:id="@+id/checked1"
        android:layout_width="14dp"
        android:layout_height="14dp"
        android:layout_marginTop="64dp"
        android:layout_marginEnd="153dp"
        android:layout_marginRight="151dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/course" />

    <ImageView
        android:id="@+id/checked2"
        android:layout_width="14dp"
        android:layout_height="14dp"
        android:layout_marginTop="87dp"
        android:layout_marginEnd="153dp"
        android:layout_marginRight="148dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/length" />

    <ImageView
        android:id="@+id/checked1u"
        android:layout_width="14dp"
        android:layout_height="14dp"
        android:layout_marginTop="64dp"
        android:layout_marginEnd="153dp"
        android:layout_marginRight="148dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/course" />

    <ImageView
        android:id="@+id/checked2u"
        android:layout_width="14dp"
        android:layout_height="14dp"
        android:layout_marginTop="87dp"
        android:layout_marginEnd="153dp"
        android:layout_marginRight="152dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/length" />

    <EditText
        android:id="@+id/secInput"
        android:layout_width="69dp"
        android:layout_height="39dp"
        android:layout_marginStart="132dp"
        android:layout_marginLeft="132dp"
        android:layout_marginTop="76dp"
        android:backgroundTint="@color/black"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="Sec."
        android:inputType="numberPassword"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/black"
        android:textSize="15dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/splitAuto" />

    <EditText
        android:id="@+id/milliInput"
        android:layout_width="69dp"
        android:layout_height="39dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="76dp"
        android:layout_marginEnd="132dp"
        android:layout_marginRight="132dp"
        android:backgroundTint="@color/black"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="Milli."
        android:inputType="numberPassword"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/black"
        android:textSize="15dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintLeft_toRightOf="@id/secInput"
        app:layout_constraintTop_toBottomOf="@+id/splitAuto" />

    <EditText
        android:id="@+id/offset"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="76dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:backgroundTint="@color/black"
        android:ems="10"
        android:fontFamily="@font/product_regular"
        android:hint="Time Offset Per Length"
        android:inputType="numberPassword"
        android:textAlignment="center"
        android:textColor="@color/black"
        android:textColorHint="@color/black"
        android:textSize="15dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.507"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/splitAuto" />

    <Button
        android:id="@+id/add"
        android:layout_width="101dp"
        android:layout_height="35dp"
        android:layout_marginStart="292dp"
        android:layout_marginLeft="292dp"
        android:layout_marginTop="124dp"
        android:background="@color/transparent"
        app:layout_constraintStart_toStartOf="@+id/splashdebugoutput"
        app:layout_constraintTop_toBottomOf="@+id/splitManual" />

    <Button
        android:id="@+id/remove"
        android:layout_width="101dp"
        android:layout_height="35dp"
        android:layout_marginTop="4dp"
        android:background="@color/transparent"
        app:layout_constraintEnd_toEndOf="@+id/add"
        app:layout_constraintTop_toBottomOf="@+id/add" />

    <ListView
        android:id="@+id/splitList"
        android:layout_width="113dp"
        android:layout_height="95dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="140dp"
        android:divider="@color/black"
        android:dividerHeight="1dp"
        android:scrollbarThumbVertical="@drawable/gray_scroll_style"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"></ListView>

    <TextView
        android:id="@+id/txtData"
        android:layout_width="136dp"
        android:layout_height="69dp"
        android:layout_marginStart="132dp"
        android:layout_marginLeft="132dp"
        android:text="1"
        android:visibility="invisible"
        android:textColor="@color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/debugOutput2"
        android:layout_width="96dp"
        android:layout_height="69dp"
        android:text="TextView"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这里似乎有很多硬编码密度像素。您是否尝试过使用dimen.xml