如何在 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)