Не удается анимировать с помощью ConstraintSet: plop.xml plop_alt.xml - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в ConstraintLayout, и я пытался сделать простую анимацию:

Одна кнопка, один текст, когда я нажимаю на кнопку, текст перемещается из верхней части экрана в нижнюю часть экрана.И если вы нажмете снова то же самое, но наоборот.Пожалуйста, не заботьтесь о возможностях рефакторинга, я просто пытаюсь сделать что-то, что работает.Кажется, анимация не работает.

Мой XML:

<android.support.constraint.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="@color/colorWhite"
    android:clickable="true"
    android:focusable="true"
    android:id="@+id/merde">

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="60dp"
        android:text="Hello"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/plop_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

И мой альтернативный XML:

<android.support.constraint.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="@color/colorWhite"
    android:clickable="true"
    android:focusable="true"
    android:id="@+id/merde">

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="60dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Hello"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:id="@+id/textview"/>

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/plop_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

И мои контроллеры:

public class Plop extends Controller {

    @BindView(R.id.plop_button)
    AppCompatButton button;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.plop, container, false);
        ButterKnife.bind(this , view);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    ChangeBounds transition = new ChangeBounds();
                    ConstraintLayout controllersLoadingRootConstaintLayout = (ConstraintLayout) getLayoutInflater().inflate(R.layout.plop,null);
                    ConstraintSet constraintSetAlt = new ConstraintSet();

                    transition.setDuration(1000);

                    TransitionManager.beginDelayedTransition(controllersLoadingRootConstaintLayout, transition);

                    ConstraintLayout c1 = (ConstraintLayout) getLayoutInflater().inflate(R.layout.plop_alt,null);
                    constraintSetAlt.clone(c1);
                    constraintSetAlt.applyTo(controllersLoadingRootConstaintLayout);

            }
        });

        return view;
    }

    @Override
    public void save() {

    }

    @Override
    public void loadData() {

    }

    @Override
    public void updateView() {

    }
}

Что я сделал не так?

РЕДАКТИРОВАТЬ: проблема выше устранена благодаря plaskoff.

Сейчас я пытаюсь сделать это в упражнении:

В моемonCreated:

protected void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    setContentView(R.layout.controllers_loading_root);
    ChangeBounds transition = new ChangeBounds();
    ConstraintLayout controllersLoadingRootConstaintLayout = (ConstraintLayout)findViewById(R.id.controllers_loading_root_constraint_layout);
    ConstraintSet constraintSetAlt = new ConstraintSet();
    transition.setDuration(1000);TransitionManager.beginDelayedTransition(controllersLoadingRootConstaintLayout, transition);
    ConstraintLayout c1 = (ConstraintLayout) getLayoutInflater().inflate(R.layout.controllers_loading_root_alt,null);
    constraintSetAlt.clone(c1);
    constraintSetAlt.applyTo(controllersLoadingRootConstaintLayout);
    ...
}

Моя активность отображается в окончательном состоянии без анимации.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Проблема в том, что вы используете неправильный экземпляр ConstraintLayout для анимации:

ConstraintLayout controllersLoadingRootConstaintLayout = (ConstraintLayout) getLayoutInflater().inflate(R.layout.plop,null)

Вы надуваете новый объект ConstraintLayout, который отличается от отображаемого в данный момент.Поэтому вам следует заменить приведенную выше строку на:

ConstraintLayout controllersLoadingRootConstaintLayout = (ConstraintLayout) view.findViewById(R.id.merde);

В качестве примечания, вам не нужно создавать новый объект ConstraintLayout для клонирования ограничений.Вы можете использовать void clone (Context context, int constraintLayoutId) для клонирования их из файла макета.

ПРАВКА, чтобы ответить на следующий вопрос:

Если вы хотите запустить анимацию как можно скореекак показано действие, вы можете переместить код для анимации в метод onWindowFocusChanged() в упражнении:

@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.controllers_loading_root);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus){
        ChangeBounds transition = new ChangeBounds();
        ConstraintLayout controllersLoadingRootConstaintLayout = (ConstraintLayout)findViewById(R.id.controllers_loading_root_constraint_layout);
        ConstraintSet constraintSetAlt = new ConstraintSet();
        transition.setDuration(1000);
        TransitionManager.beginDelayedTransition(controllersLoadingRootConstaintLayout, transition);
        ConstraintLayout c1 = (ConstraintLayout) getLayoutInflater().inflate(R.layout.controllers_loading_root_alt,null);
        constraintSetAlt.clone(c1);
        constraintSetAlt.applyTo(controllersLoadingRootConstaintLayout);
    }
}
0 голосов
/ 02 июня 2018

По-прежнему недостаточно повторений для комментария, поэтому в качестве ответа (hmpf):
Прежде всего, у вашего TextView в макете alt нет идентификатора, не уверен, что это часть проблемы, просто хотелчтобы указать на это.
Во-вторых, вы помещаете клонирование в onClick.Вы должны поместить это в onCreateView (например), как указано в официальном документе , и просто использовать applyTo в onClick.

...