Как навсегда переместить весь ConstraintLayout во время выполнения? - PullRequest
1 голос
/ 25 октября 2019

Расположенный внутри моего основного ConstraintLayout, у меня есть еще один ConstraintLayout с Id = stripLayout с ImageView и несколькими кнопками внутри. Я хочу иметь возможность перемещать внутренний ConstraintLayout (изображение, кнопки и все) влево и вправо, и для этого я пробую анимацию, как показано в приведенном ниже коде:

ConstraintLayout скользит, как и ожидалось, но послеанимация завершена, она сбрасывается в исходное положение. Вероятно, это связано с тем, что код для метода onAnimationEnd(), похоже, не влияет на конечную позицию, так как я пытался установить params.leftMargin = 0 и другие значения, не замечая никакой разницы в поведении. По-видимому, это работает с представлениями, как было установлено в других публикациях ( Android-анимация перевода - навсегда переместить Просмотр на новую позицию с помощью AnimationListener ), но как это сделать с ConstraintLayout?

ConstraintLayout stripImageLayout = findViewById(R.id.stripLayout);

TranslateAnimation anim_to_right = new TranslateAnimation(0, pixToSlide, 0, 0);

anim_to_right.setDuration(1000);

anim_to_right.setAnimationListener(new TranslateAnimation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationRepeat(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) {
                ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)stripImageLayout.getLayoutParams();
                params.leftMargin += pixToSlide;
                stripImageLayout.setLayoutParams(params);
            }
        });

stripImageLayout.startAnimation(anim_to_right);

и activity_main.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:onClick="onBackgroundClick"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/outletInfoLayout"
        android:layout_width="151dp"
        android:layout_height="387dp"
        android:layout_marginTop="68dp"
        android:layout_marginEnd="100dp"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/ThresholdValue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:text="NONE"
            app:layout_constraintBottom_toBottomOf="@+id/textView4"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toEndOf="@+id/textView4"
            app:layout_constraintTop_toTopOf="@+id/textView4"
            app:layout_constraintVertical_bias="1.0" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:text="Threshold:"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2" />

        <TextView
            android:id="@+id/deviceName"
            android:layout_width="136dp"
            android:layout_height="80dp"
            android:textSize="30sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="31dp"
            android:text="Outlet: "
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/deviceName" />

        <TextView
            android:id="@+id/outletNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/textView2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="@+id/ThresholdValue"
            app:layout_constraintTop_toTopOf="@+id/textView2"
            app:layout_constraintVertical_bias="0.0" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/stripLayout"
        android:layout_width="103dp"
        android:layout_height="475dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="80dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Button
            android:id="@+id/outlet3button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet3ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/outlet2button" />

        <Button
            android:id="@+id/outlet1button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="75dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet1ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/smartstripImage" />

        <Button
            android:id="@+id/outlet2button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet2ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/outlet1button" />

        <Button
            android:id="@+id/outlet5button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet5ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/outlet4button" />

        <ImageView
            android:id="@+id/smartstripImage"
            android:layout_width="81dp"
            android:layout_height="441dp"
            android:contentDescription="@string/smartstrip_icon"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/strip" />

        <Button
            android:id="@+id/outlet4button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet4ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/outlet3button" />

        <Button
            android:id="@+id/outlet6button"
            android:layout_width="60dp"
            android:layout_height="37dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="8dp"
            android:background="@android:color/transparent"
            android:onClick="onOutlet6ButtonClick"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/outlet5button" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Расположение ConstaintLayout слева направо, которое вы пытаетесь анимировать, контролируется его правым полем. В конце анимации вы пытаетесь сместить этот макет, установив левое поле: вам нужно уменьшить правое поле на величину смещения и оставить левое поле в покое.

Я предлагаю вамзамените onAnimationEnd () на что-то вроде этого:

@Override
public void onAnimationEnd(Animation animation) {
    stripImageLayout.clearAnimation(); // Stop jump to start
    ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) stripImageLayout.getLayoutParams();
    params.rightMargin -= pixToSlide;
    stripImageLayout.setLayoutParams(params);
}

Вы также можете использовать анимацию свойств для сохранения некоторых строк кода следующим образом:

ObjectAnimator slideAnimator = ObjectAnimator.ofFloat(stripImageLayout, "translationX", pixToSlide)
    .setDuration(1000);
slideAnimator.start();

ПосколькуСвойство animation изменяет значение свойства translationX , движение выполняется post-layout . Это означает, что виды, расположение которых зависит от движущегося макета, будут размещены в соответствии с исходным положением движущегося макета, а не с его новым положением. Это может быть хорошо с вами, но это предостережение.

0 голосов
/ 25 октября 2019

Вам нужно будет использовать ConstraintSet для достижения этой цели. Это не полностью проверено, поэтому этот ответ, возможно, придется отредактировать, но что-то вроде этого, убедитесь, что вы добавили идентификатор к своему родителю ConstraintLayout:

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(R.id.parentLayout);
constraintSet.connect(R.id.outletInfoLayout, ConstraintSet.START, R.id.parentLayout, ConstraintSet.START, startMarginInPixels);
constraintSet.applyTo(R.id.parentLayout);

Чтобы сделать все проще, хотя, ябудет использовать MotionLayout, хотя он все еще находится в бета-версии.

...