更深入地了解ChangeBounds过渡

时间:2019-05-25 19:08:10

标签: android android-transitions

前一段时间,我编写了一个自定义过渡,除了ChangeBounds动画外,该过渡还为视图高程,背景色和角半径设置了动画。 VIDEO VIDEO2

现在,由于我需要进行更多的自定义,我决定检查ChangeBounds的源代码以了解其工作原理。

这是ChangeBounds的一段代码,您可能知道它是一个共享元素过渡,可以动画显示视图边界和位置。

sceneRoot.getLocationInWindow(tempLocation);
            Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
                    Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            view.draw(canvas);
            final BitmapDrawable drawable = new BitmapDrawable(bitmap);
            view.setVisibility(View.INVISIBLE);
            sceneRoot.getOverlay().add(drawable);
            Rect startBounds1 = new Rect(startX - tempLocation[0], startY - tempLocation[1],
                    startX - tempLocation[0] + view.getWidth(),
                    startY - tempLocation[1] + view.getHeight());
            Rect endBounds1 = new Rect(endX - tempLocation[0], endY - tempLocation[1],
                    endX - tempLocation[0] + view.getWidth(),
                    endY - tempLocation[1] + view.getHeight());
            ObjectAnimator anim = ObjectAnimator.ofObject(drawable, "bounds",
                    sRectEvaluator, startBounds1, endBounds1);
            anim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    sceneRoot.getOverlay().remove(drawable);
                    view.setVisibility(View.VISIBLE);
                }
            });

它不是执行视图的实际测量,而是这样做:

  • 拍摄视图快照。
  • 将该快照添加到视图的父级作为可绘制的叠加层。 (sceneRoot是父级)
  • 使视图不可见。
  • 开始为可绘制的叠加层设置动画。 (调整边界和位置,以使视图本身看起来像是在制作动画)
  • 在动画结束时,删除可绘制的叠加层,并使视图再次可见。

我的自定义过渡实现非常接近this one。注意它是如何操纵视图背景的。

现在,我希望链接的代码或我自己的实现在视觉上不起作用,因为它们基于使用超类声明为不可见的视图。但是它们工作得很好。我在这里想念什么?

0 个答案:

没有答案