Дръжте View отгоре по време на анимация

Имам проблем с поддържането на изглед отгоре по време на преход на дейност. Картината вляво на картата е споделен елемент, който се разширява, за да покрие половината от втората дейност, и имам 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