Android:我可以使用TransitionManager.beginDelayedTransition监听动画更新吗?

dr_*_*lli 10 android android-animation

我正在使用此处TransitionManager.beginDelayedTransition概述的 动画在RelativeLayout中交换位置的两个视图的动画.我通过简单地交换两个视图中的两个来实现这一点.RelativeLayout.LayoutParams

我的问题是如何监视自动创建和执行的动画,TransitionManager而无需创建自己的自定义过渡.我需要检测动画何时结束,以便我可以更改已交换的视图.

下面是交换两个视图的方法.CollageCanvasAperture是一个扩展,View而mApertureGroup是包含这些视图的RelativeLayout.

private void shuffle(int fromApertureInd, int toApertureInd) {
    final CollageCanvasAperture fromV = (CollageCanvasAperture) mApertureGroup.getChildAt(fromApertureInd);
    final CollageCanvasAperture toV = (CollageCanvasAperture) mApertureGroup.getChildAt(toApertureInd);

    if (null == fromV || null == toV) {
        return;
    }

    TransitionManager.beginDelayedTransition(mApertureGroup);

    RelativeLayout.LayoutParams fromLP = (RelativeLayout.LayoutParams) fromV.getLayoutParams();
    RelativeLayout.LayoutParams toLP = (RelativeLayout.LayoutParams) toV.getLayoutParams();

    fromV.setLayoutParams(toLP);
    toV.setLayoutParams(fromLP);
}
Run Code Online (Sandbox Code Playgroud)

我已经在这里进行了几个小时的搜索并梳理了TransitionManager代码,但无法看到如何检测更改.我更喜欢能够在CollageCanvasAperture中检测到动画结束,但是看不到要应用的任何相关侦听器.

我想我可以在执行动画之前提供目标LayoutParams的视图,然后视图可以监听大小和位置的变化,直到它们匹配......?

dr_*_*lli 22

因此事实证明,为这些"自动"转换添加侦听器非常简单.

而不是使用:TransitionManager.beginDelayedTransition(mApertureGroup); 您需要确定在调用beginDelayedTransition和调用时正在使用哪个自动Transition TransitionManager.go().

我的视图转换使用ChangeBounds Transition.一旦知道,我所要做的就是:

    ChangeBounds mySwapTransition = new ChangeBounds();
    mySwapTransition.addListener(new Transition.TransitionListener() {
        @Override
        public void onTransitionStart(Transition transition) { }

        @Override
        public void onTransitionEnd(Transition transition) { }

        @Override
        public void onTransitionCancel(Transition transition) {}

        @Override
        public void onTransitionPause(Transition transition) { }

        @Override
        public void onTransitionResume(Transition transition) { }
    });

    TransitionManager.go(new Scene(mApertureGroup), mySwapTransition);
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`AutoTransition transition = new AutoTransition();`如果你想使用默认转换,例如.移动视图 (7认同)
  • 后期添加,但是如果你只希望覆盖`Transition.TransitionListener`接口中的一个或两个(或任何少于ALL)的方法,那么值得注意的是还有`TransitionListenerAdapter`. (7认同)
  • TransitionManager.beginDelayedTransition()具有第二个参数-Transition,因此您不必使用TransitionManager.go() (2认同)