【问题标题】:Keep View on top during animation在动画期间保持视图在顶部
【发布时间】:2015-02-06 00:32:03
【问题描述】:

在活动转换期间,我无法将视图保持在顶部。卡片左侧的图片是一个共享元素,它扩展为覆盖第二个活动的一半,我有一个从底部滑入的 FAB。我将饮料的 ImageView 作为共享元素过渡,FAB 是从底部开始的滑动过渡。

在 FAB 的滑动动画期间,它停留在 ImageView 下方,如您在第二张图片中所见。然而,在它完成动画之后,它会弹出到 ImageView 的顶部,如您在第三张图片中所见。我在退出过渡期间遇到了同样的问题,当它开始滑动时它立即弹出到 ImageView 下方。

我希望 FAB 在整个过程中始终位于 ImageView 之上,我该如何实现呢?

主要活动:

FAB还在滑动时的第二个Activity:

FAB完成滑动后的第二个Activity:

二级Activity的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);
}

【问题讨论】:

  • 能否分享第二个活动的xml代码?您如何为 FAB 制作动画?你也可以分享那个代码吗?什么触发了动画?
  • 我已将此添加到帖子中

标签: android transitions


【解决方案1】:

默认情况下,Android 使用ViewOverlay 进行活动转换。这就是为什么共享元素被绘制在其他一切之上的原因。

您可以在开始转换之前调用getWindow().setSharedElementsUseOverlay(false); 禁用此功能。这应该告诉 Android 在动画期间使用原始视图层次结构

【讨论】:

  • 帕维尔,这行得通!感谢您的输入,我之前读过here,禁用它可能会导致一些奇怪的故障。我的应用没有出现任何这些故障,但除了关闭覆盖之外,还有其他方法可以缓解这个问题吗?
  • 您所指的“错误”并不是真正的错误:)它是基于视图层次结构的行为。在该帖子中,ImageView 位于底部下方。这就是为什么它在动画的第一部分被覆盖。在您的情况下,您不应该遇到此类问题,因为在您的层次结构中,FAB 位于其他 UI 元素之上,因此即使没有覆盖也不会被覆盖
  • 感谢 Pavel 的精彩解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多