Android共享元素动画

Andriod 5.0及之后,开始支持共享元素动画,该动画主要用于两个activity之间,两个Activity可以共享某些控件,Activity A跳转到Activity B的时候,A的某个控件能自动移动到B的相应控件的位置,产生动画。

  1. 在要共享的控件加上属性transitionName ,ActivityA和ActivityB的布局文件都要加,并且对应做动画的view的属性值要一样。
 <View
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:transitionName="goods_bg_share_element"
            android:background="@color/white"/>
    <ImageView
            android:id="@+id/img_share_element"
            android:layout_width="@dimen/dimen_1080_cp"
            android:layout_height="@dimen/dimen_534_cp"
            android:scaleType="fitCenter"
            android:background="@color/white"
            android:transitionName="goods_img_share_element"/>
  1. 跳转页面
//多个共享元素
Pair<View, String> pair1 = Pair.create(view.findViewById(R.id.img), "goods_img_share_element");
Pair<View, String> pair2 = Pair.create(view, "goods_bg_share_element");
Intent intent = new Intent(activity, ActivityA.class);
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pair1,pair2).toBundle();
startActivity(intent, bundle);
  1. 动画展示时机问题
    有时我们发现动画不执行,那是因为view还没绘制完成就做动画看不到效果,那么此时我们就需要延迟执行,等view绘制出来再去做动画。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_points_exchange_detail);
 		//.....初始化view代码...
 		//延迟动画执行
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            postponeEnterTransition();
            scheduleStartPostponedTransition(view);
        }
    }
    
private void scheduleStartPostponedTransition(final View sharedElement) {
        sharedElement.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        //移除监听
                      sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
                        // 启动进入动画
                        supportStartPostponedEnterTransition();
                        return true;
                    }
                });
    }
  1. 数据展示及效果问题
    一般情况下我们第二个页面的数据都需要从网络加载,有可能动画都执行完了数据还没加载回来,就会导致展示效果不好的问题,那么我们就可以写一个或多个假的view在页面底部,然后将做动画的view的数据传递到第二个界面,展示在要做动画的view上,保证动画效果,这样当真的数据展示出来后也能正常的盖住假的view,不影响数据展示。

    Android共享元素动画实现方式其实就是正常启动ActivityB,将背景还有那些不做动画的view的透明度都设为0,等动画结束后,将那些不做动画的view的透明度慢慢再设置回来,所以添加假view放置底部去做动画是一个比较好的方案,不会影响正常逻辑。

你可能感兴趣的:(Android)