如何在 Android constraint layout outside the screen 开始时定位视图
How to position a view in Android constraint layout outside the screen at the beginning
我在约束布局中有一个视图,我希望它在一开始就应该在屏幕之外(然后慢慢地从右到左移动到屏幕中)。现在,我有点需要负偏差或边距之类的东西。
我看过这个问题。使用 android:layout_marginTop="-25dp"
接受的答案没有任何效果(虽然视图的顶部受到限制并且我使用“androidx.constraintlayout:constraintlayout:2.1.3”)。
我尝试了第二个最赞的答案并使用了代码:
view.setTranslationX(view.getWidth() - 20);
这确实有效。但是,问题是当创建 Fragment 时,您首先看到视图在短时间内不在左侧。这不是我想要的。我希望在一开始就让视图超出布局的右边缘,以便稍后可以移动到布局中。
你知道我该怎么做吗?理想情况下,我想以编程方式执行此操作。
更新:这是 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="@drawable/game_test_background"
tools:context=".MainActivity"
android:id="@+id/constraintLayout">
<ImageView
android:id="@+id/imageView_RedRectange_Test"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_marginTop="-1250dp"
app:layout_constraintWidth_percent="0.25"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.048"
app:srcCompat="@drawable/red_rectangle" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.102"
app:layout_constraintHorizontal_bias="0.373"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.745"
app:layout_constraintWidth_percent="0.12" />
</androidx.constraintlayout.widget.ConstraintLayout>
好的,要获得负边距,您可以使用 translateX、translateY 或 TranslationZ。
在xml中像这样:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:translationX="-60dp"
android:translationY="-90dp"
android:translationZ="-420dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
或像这样以编程方式:
View view = ...;
view.setTranslationX(-60);
view.setTranslationY(-90);
view.setTranslationZ(-420);
然后为了慢慢地从右到左引入它,你可以像这样使用 animate() 方法:
View view = ...;
view.animate().setDuration(1000).translationX(-600).start();
当 ImageView 具有负边距时,使用 app:layout_constraintWidth_percent
设置按钮的宽度存在问题。如果您可以为按钮设置确定的宽度(而不是 0dp
),问题应该会消失。
如果您将 app:layout_constraintWidth_percent
设置为使按钮的文本完全显示在一行中的值,该问题也应该可以解决。
这里有一个简化的布局来演示这个问题。 ConstraintLayout 有两个视图,它们被简单地约束到父级以显示在布局的垂直中心。这两个视图彼此没有依赖关系。此外,ImageView 的上边距为 -250dp
,因此它应该出现在布局的垂直中心上方。
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_light">
<ImageView
android:id="@+id/redRectangle"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginTop="-250dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/red_rectangle" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Button"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.12" />
</androidx.constraintlayout.widget.ConstraintLayout>
这是 ImageView 的宽度从 0dp
更改为 non-zero 值 1dp
时发生的情况。当宽度设置为 0dp
时,负边距似乎被忽略了。只有当宽度设置为 non-zero 值时,ImageView 才能正确放置。
改变按钮的宽度应该不会影响 ImageView 的位置;但是,只有当按钮的宽度为 non-zero 时,按钮才会出现在正确的位置。
这是增加 app:layout_constraintWidth_percent
以致“按钮”一词不会被截断时发生的情况。
同样,ImageView 的位置应该与按钮的宽度无关。相反,只有当 app:layout_constraintWidth_percent
设置为“按钮”一词不会被截断时,按钮才会出现在正确的位置。
这只是负边距的问题。正边距按预期工作。
这是一个奇怪的问题,因此您可能需要使用提到的其他解决方案之一。
(ConstraintLayout 版本 2.1.3)
我在约束布局中有一个视图,我希望它在一开始就应该在屏幕之外(然后慢慢地从右到左移动到屏幕中)。现在,我有点需要负偏差或边距之类的东西。
我看过这个问题android:layout_marginTop="-25dp"
接受的答案没有任何效果(虽然视图的顶部受到限制并且我使用“androidx.constraintlayout:constraintlayout:2.1.3”)。
我尝试了第二个最赞的答案并使用了代码:
view.setTranslationX(view.getWidth() - 20);
这确实有效。但是,问题是当创建 Fragment 时,您首先看到视图在短时间内不在左侧。这不是我想要的。我希望在一开始就让视图超出布局的右边缘,以便稍后可以移动到布局中。
你知道我该怎么做吗?理想情况下,我想以编程方式执行此操作。
更新:这是 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="@drawable/game_test_background"
tools:context=".MainActivity"
android:id="@+id/constraintLayout">
<ImageView
android:id="@+id/imageView_RedRectange_Test"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_marginTop="-1250dp"
app:layout_constraintWidth_percent="0.25"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.048"
app:srcCompat="@drawable/red_rectangle" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.102"
app:layout_constraintHorizontal_bias="0.373"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.745"
app:layout_constraintWidth_percent="0.12" />
</androidx.constraintlayout.widget.ConstraintLayout>
好的,要获得负边距,您可以使用 translateX、translateY 或 TranslationZ。
在xml中像这样:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:translationX="-60dp"
android:translationY="-90dp"
android:translationZ="-420dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
或像这样以编程方式:
View view = ...;
view.setTranslationX(-60);
view.setTranslationY(-90);
view.setTranslationZ(-420);
然后为了慢慢地从右到左引入它,你可以像这样使用 animate() 方法:
View view = ...;
view.animate().setDuration(1000).translationX(-600).start();
当 ImageView 具有负边距时,使用 app:layout_constraintWidth_percent
设置按钮的宽度存在问题。如果您可以为按钮设置确定的宽度(而不是 0dp
),问题应该会消失。
如果您将 app:layout_constraintWidth_percent
设置为使按钮的文本完全显示在一行中的值,该问题也应该可以解决。
这里有一个简化的布局来演示这个问题。 ConstraintLayout 有两个视图,它们被简单地约束到父级以显示在布局的垂直中心。这两个视图彼此没有依赖关系。此外,ImageView 的上边距为 -250dp
,因此它应该出现在布局的垂直中心上方。
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_light">
<ImageView
android:id="@+id/redRectangle"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginTop="-250dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/red_rectangle" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Button"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.12" />
</androidx.constraintlayout.widget.ConstraintLayout>
这是 ImageView 的宽度从 0dp
更改为 non-zero 值 1dp
时发生的情况。当宽度设置为 0dp
时,负边距似乎被忽略了。只有当宽度设置为 non-zero 值时,ImageView 才能正确放置。
改变按钮的宽度应该不会影响 ImageView 的位置;但是,只有当按钮的宽度为 non-zero 时,按钮才会出现在正确的位置。
这是增加 app:layout_constraintWidth_percent
以致“按钮”一词不会被截断时发生的情况。
同样,ImageView 的位置应该与按钮的宽度无关。相反,只有当 app:layout_constraintWidth_percent
设置为“按钮”一词不会被截断时,按钮才会出现在正确的位置。
这只是负边距的问题。正边距按预期工作。
这是一个奇怪的问题,因此您可能需要使用提到的其他解决方案之一。
(ConstraintLayout 版本 2.1.3)