Держите вид сверху во время анимации

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

Во время анимации слайдов FAB он остается ниже ImageView, как вы можете видеть на втором рисунке. Однако после завершения анимации он появляется поверх ImageView, как вы можете видеть на третьем рисунке. У меня такая же проблема во время перехода выхода, когда он сразу появляется под ImageView, когда он начинает скользить.

Я хочу, чтобы FAB оставался поверх ImageView на протяжении всего процесса, как мне реализовать это?

Основная активность:

Вторичная активность, когда FAB все еще скользит:

Вторичная активность после завершения скольжения FAB: введите здесь описание изображения

XML-файл вторичного действия:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/drinkImage"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
        android:gravity="start"
        android:transitionName="@string/drink_image_transition"
        />

    <TextView
        android:padding="8dp"
        android:id="@+id/drinkName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:translationY="@dimen/detail_drink_name_vertical_offset"
        android:textSize="24sp"
        android:textColor="@color/text_primary"
        android:transitionName="@string/drink_name_transition"
        />

    <ImageButton
        android:id="@+id/fab"
        android:layout_width="@dimen/fab_size_normal"
        android:layout_height="@dimen/fab_size_normal"
        android:layout_margin="@dimen/add_button_margin"
        android:translationX="@dimen/detail_fab_horizontal_offset"
        android:translationY="@dimen/detail_fab_vertical_offset"
        android:background="@drawable/fab_shape"
        android:elevation="@dimen/elevation_low"
        android:src="@drawable/fab_ic_add"
        android:stateListAnimator="@anim/button_elevation"
        android:transitionName="fab_transition"
        />
</RelativeLayout>

Метод onCreate() для вторичного действия:

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

    //grab Drink parcel
    Drink d = getIntent().getParcelableExtra("drink");

    //set up image
    ImageView i = (ImageView) findViewById(R.id.drinkImage);
    i.setImageDrawable(this.getResources().getDrawable(d.getImageResourceID(this)));

    //set up text
    TextView t = (TextView) findViewById(R.id.drinkName);
    t.setText(d.name);

    Transition ts = new Slide();

    //don't want status bar and navigation bar to slide across screen
    ts.excludeTarget(android.R.id.statusBarBackground, true);
    ts.excludeTarget(android.R.id.navigationBarBackground, true);
    ts.setDuration(3000);

    getWindow().setEnterTransition(ts);
    getWindow().setExitTransition(ts);

    //This line gets it to work! As Pavel suggested
    //getWindow().setSharedElementsUseOverlay(false);
}

person mithunm93    schedule 06.02.2015    source источник
comment
Не могли бы вы поделиться xml-кодом второго действия? Как вы делаете анимацию для FAB? Не могли бы вы поделиться этим кодом? Что запускает анимацию?   -  person Quanturium    schedule 06.02.2015
comment
я добавил это в пост   -  person mithunm93    schedule 06.02.2015


Ответы (1)


По умолчанию Android использует ViewOverlay для переходов активности. Вот почему общий элемент рисуется поверх всего остального.

Вы можете отключить это, вызвав getWindow().setSharedElementsUseOverlay(false) ; перед началом перехода. Это должно сказать Android использовать исходную иерархию представлений во время анимации.

person Pavel Dudka    schedule 06.02.2015
comment
Павел, это работает! Спасибо за вклад, я ранее читал здесь, что отключение этого может привести к странным сбоям. В моем приложении нет ни одного из этих сбоев, но есть ли другой способ смягчить эту проблему, кроме как отключить наложение? - person mithunm93; 06.02.2015
comment
Ошибка, о которой вы говорите, на самом деле не ошибка :) Это поведение, основанное на иерархии представлений. В этом посте ImageView расположен ниже нижней части. Вот почему это рассматривается в первой части анимации. В вашем случае у вас не должно быть таких проблем, так как в вашей иерархии FAB расположен над другими элементами пользовательского интерфейса, поэтому он не будет покрыт даже без наложения. - person Pavel Dudka; 06.02.2015
comment
Павел, спасибо за прекрасное объяснение! - person mithunm93; 08.02.2015