当滚动时,共享元素转换会产生奇怪的行为

时间:2018-04-11 09:08:15

标签: android transitions android-transitions shared-element-transition

我正在使用活动之间的共享元素转换。第一项活动包含LinearLayoutRecyclerView

enter image description here

第二项活动:

enter image description here

这是我的代码,看起来非常简单:

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) getContext(), pairs);
ActivityCompat.startActivity(getContext(), new Intent(Intent.ACTION_VIEW, scheme), options.toBundle());

在一般情况下,一切似乎都没问题,过渡动画效果很好。但是如果我在第一个活动中的RecyclerView滚动时开始下一个活动,那么回到第一个活动,会发生一些可怕的事情:

enter image description here

我还测试了ListViewViewPagerListView有同样的问题而ViewPager没有。如果我在startActivity之前停止滚动,一切都会好的。

然而,在我的产品环境中,视图很复杂,找到所有ListViewRecyclerView并停止滚动是很难看的。除了在startActivity之前停止滚动之外,还有其他方法可以防止它发生吗?

1 个答案:

答案 0 :(得分:0)

RecyclerView类没有这种方法来禁用滚动。像下面一样自己创建CustomRecyclerView。

public class FooRecyclerView extends RecyclerView {

   private boolean verticleScrollingEnabled = true;

   public void enableVersticleScroll (boolean enabled) {
       verticleScrollingEnabled = enabled;
   }

   public boolean isVerticleScrollingEnabled() {
       return verticleScrollingEnabled;
   }

   @Override
   public int computeVerticalScrollRange() {

      if (isVerticleScrollingEnabled())
          return super.computeVerticalScrollRange();
      return 0;
   }


  @Override
  public boolean onInterceptTouchEvent(MotionEvent e) {

     if(isVerticleScrollingEnabled())
         return super.onInterceptTouchEvent(e);
     return false;

  }



   public FooRecyclerView(Context context) {
       super(context);
   }

   public FooRecyclerView(Context context, @Nullable AttributeSet attrs) {
       super(context, attrs);
   }

   public FooRecyclerView(Context context, @Nullable AttributeSet attrs,        int defStyle) {
       super(context, attrs, defStyle);
   }
}

将RecyclerView替换为上面创建的自定义视图,

<com.customGoogleViews.FooRecyclerView
        android:id="@+id/task_sub_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

在开始新活动之前禁用滚动,

recyclerview.enableVersticleScroll(false);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) getContext(), pairs);
ActivityCompat.startActivity(getContext(), new Intent(Intent.ACTION_VIEW, scheme), options.toBundle());

希望有所帮助:)