android - 适应多种手机屏幕尺寸的困难
问题描述
我目前正在开发一个应用程序,并试图让它支持多种手机屏幕尺寸(它不支持比 Google Pixel 3 XL 更大的任何东西)。此外,仅出于上下文考虑,我使用的是 ConstraintLayout。
对于布局的背景,我使用的是图像。在背景之上,我精心放置了可交互的元素,以匹配它们在背景上应该对应的位置。然而,这并不能很好地在所有显示器上进行转换,因为布局元素和背景变得扭曲和错位。我对此的解决方案是尝试为手机制作不同的布局,这些布局将根据其分辨率应用(为具有以下屏幕尺寸的手机制作布局:1080x1920、1080x2160、1440x2560、1440x2880、1440x2960)。
但是,这些似乎不会自动应用于我测试过的任何设备。我假设这是因为手机没有任何规格,而且这只适用于平板电脑、手表等。我最近才想到将所有内容从我的 UI 转移到我的布局中,并使用 ImageViews 来实现所有内容,但这并没有也不起作用,因为当手机屏幕尺寸发生变化时,所有元素都会失去它们在屏幕中的正确位置。我已经尝试了几乎所有的东西,并且想不出其他任何事情可以让我的应用程序适应所有屏幕尺寸。
我将提供一种更复杂的布局以供参考。真的希望对这一点有所帮助。谢谢!
布局
<?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?
推荐阅读
- c# - IApplicaionBuilder 不包含定义 MapSignalR()。app.MapSignalR() 在 ASP.NET CORE 上不起作用
- laravel - foreach 关系数据
- android - 用户进入谷歌地图特定区域时如何调用方法
- git - 当我将项目推送到 Github 时,我有最早提交的文件,为什么?
- python - 为什么我使用多处理和熊猫得到这个 KeyError?
- email - 为什么我的 Outlook 添加随机停止工作?
- mysql - 包含句点和尾随单个数字的 Mysql 布尔全文搜索的开发与生产问题
- sqlite - 我如何用 sqlite3 放弃约束?
- c# - C# 计算 RSI 会出现问题
- smarty - 有没有办法从 smarty 解析信息?