ConstraintLayout-如何防止圆圈将其他视图推离页面?检查最小尺寸?

问题描述 投票:2回答:1

我正在尝试为计数应用程序设置布局,该应用程序在屏幕中心上方稍有一个大的圆形按钮,在屏幕下方有一个计数器显示。我在整个屏幕上都无法使圆保持圆形,也没有在所有情况下都覆盖另一个视图的麻烦。

我当前使用的设置是具有两个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>

portrait layoutlandscape layoutsplit screen portraitsplit screen landscape

android android-constraintlayout shapes
1个回答
2
投票

如您所建议,布局的主要问题是宽度/高度百分比设置为80%,并驱动其余的布局。您正在失去对圆高的控制,没有任何事情可以阻止圆高增长以覆盖其他视图。

看看ConstraintLayout chains。它们是一种功能强大的工具,可让您将视图捆绑在一起,以免彼此干扰。他们将帮助您解决重叠问题。

您仍将根据设备的方向将圆的宽度设置为宽度或高度的80%。我假设您希望边距使得圆可以占视图的80%,但是如果需要适合屏幕且不与其他视图重叠,则可以使圆变小。一种方法是定义两个Space小部件,它们的布局宽度为10%,高度为10%。一个放置在布局的左上角,另一个放置在右下角。将圆限制为左侧,顶部和右侧的这些Space小部件。将圆与下面的[[TextView放置在垂直链中。

这里是它的外观模拟。您必须使用布局来使其正确,但是这些概念应该有所帮助。 (在我看来,这也可以不用

Space

小部件来完成,但该解决方案目前尚不存在。如果它出现在我身上,我会回发。)XML遵循GIF。

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.