Использование SharedElement Переходы активности с пользовательским представлением

Я работаю над доказательством концепции, где у меня есть несколько пользовательских представлений в TableLayout. Когда щелкнуто одно из просмотров, я хочу оживить представление, расширяющееся в новое действие. Эффект, который я хочу достичь, похож на то, что видно здесь.

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

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

введите описание изображения здесь

Я считаю, что это неверно, потому что View должен быть нарисован, но есть ли способ настроить мой просмотр далее, чтобы сделать эту работу? Все примеры, которые я нашел в этом типе перехода, состояли из ImageViews, Buttons и TextViews.

Ниже приведен соответствующий источник. Мой пользовательский вид большой и не содержит специального кода, просто переопределяет onDraw() и onMeasure().

MainActivity.java

package com.rscottcarson.circleschedulertest;

import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Toast;
public class MainActivity extends Activity {

    private View view1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view1 = findViewById(R.id.circle1);

        view1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                // create the transition animation - the images in the layouts
                // of both activities are defined with android:transitionName="profile"
                ActivityOptions options = ActivityOptions
                        .makeSceneTransitionAnimation(MainActivity.this, view1, "profile");
                // start the new activity
                startActivity(intent, options.toBundle());
            }
        });

    }
}

DetailActivity.java

package com.rscottcarson.circleschedulertest;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class DetailActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

    }
}

change_image_trans.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform />
</transitionSet>

styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
        <item name="android:windowActivityTransitions">true</item>
        <item name="android:windowContentTransitions">true</item>

        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>


        <!-- specify shared element transitions -->
        <item name="android:windowSharedElementEnterTransition">
            @transition/change_image_trans</item>
        <!-- specify shared element transitions -->
        <item name="android:windowSharedElementExitTransition">
            @transition/change_image_trans</item>
    </style>

</resources>

Ответ 1

Просто попробуйте postponeEnterTransition() и startPostponedEnterTransition() в DetailActivity

postponeEnterTransition() используется для временной задержки перехода до тех пор, пока общие элементы не будут правильно измерены и выложены.

startPostponedEnterTransition() Запланирует переход общего элемента, который должен быть запущен сразу же после того, как общий элемент был измерен и выложен в иерархии вида деятельности.

DetailActivity.java

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
    postponeEnterTransition();
}

private void scheduleStartPostponedTransition(final View sharedElement) {
    sharedElement.getViewTreeObserver().addOnPreDrawListener(
        new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
                startPostponedEnterTransition();
                return true;
            }
        });
}

Ответ 2

Я не думаю, что ваша проблема в том, что у вас есть пользовательское представление... Я всегда делаю эти переходы с моими пользовательскими представлениями, и они работают нормально.

Я вижу, что этот код:

ActivityOptions options = ActivityOptions
                        .makeSceneTransitionAnimation(MainActivity.this, view1, "profile");
                // start the new activity 
                startActivity(intent, options.toBundle());

Делает то, что вы хотите.

Вот что вам нужно сделать:

Сначала, создайте свой xml с помощью перехода:

Первая активность

<YouCustomView
     android:id="@+id/someId"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:transitionName="@string/someTransition">

Вторая активность:

<YouCustomView
         android:id="@+id/someOtherId"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:transitionName="@string/someTransition">

Второй, когда вы начнете свою вторую деятельность, сделайте следующее:

        ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(
    this, new Pair<>(findViewById(R.id.someId), getString(R.string.someTransition))

startActivity(intent, activityOptions.toBundle());

Вы забыли добавить пар с представлением и именем перехода. Добавьте это, и ваш переход будет работать нормально. Тот факт, что ваш просмотр является настраиваемым, не изменяет анимацию.

Счастливое кодирование!