我正在尝试为计数应用程序设置布局,该应用程序在屏幕中心上方稍有一个大的圆形按钮,在屏幕下方有一个计数器显示。我在整个屏幕上都无法使圆保持圆形,也没有在所有情况下都覆盖另一个视图的麻烦。
我当前使用的设置是具有两个TextViews的ConstraintLayout。按钮TextView使用xml椭圆作为背景,并设置为圆形,同时将“ layout_constraintDimensionRatio”属性设置为1。在纵向模式下,宽度设置为可用空间的80%,并且在正常使用情况下屏幕相当标准时,一切都很好。
如果应用程序的可用屏幕尺寸更大,因此垂直尺寸小于水平尺寸,则会出现问题。在这种情况下,仍然要先设置宽度,以便我的圆圈覆盖其他视图或部分滑出屏幕。
目前,在景观布局中,我将计时器移到一侧。理想情况下,在横向布局中,我将使按钮居中,计数器保持在右侧,但是如果没有足够的计时器空间,则停止增加按钮的大小。
我认为理想情况下,我会设置布局以检查水平或垂直空间最初是否较短,然后首先设置较小的尺寸。这可能吗?也许有更好的方法来实现所需的布局?
非常感谢您的帮助,谢谢,凯蒂
这是默认的xml布局:
<?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:background="@android:color/white"
tools:context=".ui.CounterFragment">
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/content_description_background_image"
android:scaleType="fitStart"
android:src="@drawable/dog_image_jpg_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1"
tools:visibility="visible" />
<TextView
android:id="@+id/timer_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/timer_display"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal" />
<TextView
android:id="@+id/counter_button"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/circle_selector"
android:contentDescription="@string/counter_button_content_description"
android:text="@string/counter_text"
app:layout_constraintBottom_toTopOf="@+id/timer_display"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.375"
app:layout_constraintWidth_percent=".8" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineVertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75" />
</androidx.constraintlayout.widget.ConstraintLayout>
这是景观布局:
<?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:background="@android:color/white"
tools:context=".ui.CounterFragment">
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/content_description_background_image"
android:scaleType="fitStart"
android:src="@drawable/dog_image_jpg_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1"
tools:visibility="visible" />
<TextView
android:id="@+id/timer_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/timer_display"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/counter_button"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/counter_button"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/circle_selector"
android:contentDescription="@string/counter_button_content_description"
android:text="@string/counter_text"
app:layout_constraintBottom_toBottomOf="@id/guidelineHorizontal"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toStartOf="@id/guidelineVertical87"
app:layout_constraintHeight_percent="0.8"
app:layout_constraintStart_toEndOf="@id/guidelineVertical12"
app:layout_constraintTop_toTopOf="@id/guidelineHorizontal" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineVertical75"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.75" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineVertical12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.125" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineVertical87"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.875" />
</androidx.constraintlayout.widget.ConstraintLayout>
如您所建议,布局的主要问题是宽度/高度百分比设置为80%,并驱动其余的布局。您正在失去对圆高的控制,没有任何事情可以阻止圆高增长以覆盖其他视图。
看看ConstraintLayout chains。它们是一种功能强大的工具,可让您将视图捆绑在一起,以免彼此干扰。他们将帮助您解决重叠问题。
您仍将根据设备的方向将圆的宽度设置为宽度或高度的80%。我假设您希望边距使得圆可以占视图的80%,但是如果需要适合屏幕且不与其他视图重叠,则可以使圆变小。一种方法是定义两个Space小部件,它们的布局宽度为10%,高度为10%。一个放置在布局的左上角,另一个放置在右下角。将圆限制为左侧,顶部和右侧的这些Space小部件。将圆与下面的[[TextView放置在垂直链中。
这里是它的外观模拟。您必须使用布局来使其正确,但是这些概念应该有所帮助。 (在我看来,这也可以不用Space
小部件来完成,但该解决方案目前尚不存在。如果它出现在我身上,我会回发。)XML遵循GIF。<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<TextView
android:id="@+id/timer_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/timer_display"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/counter_button" />
<TextView
android:id="@+id/counter_button"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/circle"
android:text="@string/counter_text"
app:layout_constraintBottom_toTopOf="@+id/timer_display"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toStartOf="@+id/spaceBottomRight"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/spaceStart"
app:layout_constraintTop_toBottomOf="@+id/spaceStart"
app:layout_constraintVertical_bias="0.375"
app:layout_constraintVertical_chainStyle="packed" />
<Space
android:id="@+id/spaceBottomRight"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.10"
app:layout_constraintWidth_percent="0.10" />
<Space
android:id="@+id/spaceStart"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintHeight_percent="0.10"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.10" />
</androidx.constraintlayout.widget.ConstraintLayout>