Android 与适应多种手机屏幕尺寸有关的困难
我目前正在开发一个应用程序,并试图允许它支持多种手机屏幕尺寸(它将不支持任何大于谷歌像素3XL的尺寸)。另外,为了上下文,我使用了ConstraintLayout 对于布局的背景,我使用了一个图像。在背景之上,我精心放置了可交互的元素,以匹配它们在背景上应该对应的位置。然而,这并不能很好地在所有显示器上进行转换,因为布局元素和背景会扭曲和错位。我的解决方案是尝试根据分辨率为手机制作不同的布局(为屏幕尺寸为1080x1920、1080x2160、1440x2560、1440x2880、1440x2960的手机制作了布局) 然而,这些似乎并不自动适用于我测试过的任何设备。我假设这是因为手机没有任何规格,这只适用于平板电脑、手表等。我最近刚想把我的UI中的所有内容都转移到我的布局中,并使用ImageView实现所有内容,但这也不起作用,因为当手机 屏幕大小改变,所有元素在屏幕中失去正确的位置。为了让我的应用程序适应所有的屏幕尺寸,我已经尝试了几乎所有的方法,但想不出还有什么可以做的 我将提供一个更复杂的布局供参考。真的希望在这件事上能得到一些帮助。谢谢 布局Android 与适应多种手机屏幕尺寸有关的困难,android,android-layout,Android,Android Layout,我目前正在开发一个应用程序,并试图允许它支持多种手机屏幕尺寸(它将不支持任何大于谷歌像素3XL的尺寸)。另外,为了上下文,我使用了ConstraintLayout 对于布局的背景,我使用了一个图像。在背景之上,我精心放置了可交互的元素,以匹配它们在背景上应该对应的位置。然而,这并不能很好地在所有显示器上进行转换,因为布局元素和背景会扭曲和错位。我的解决方案是尝试根据分辨率为手机制作不同的布局(为屏幕尺寸为1080x1920、1080x2160、1440x2560、1440x2880、1440x2
<?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