我正在使用
here概述的TransitionManager.beginDelayedTransition
动画两个视图交换RelativeLayout中的位置.我这样做只需交换两个视图中的两个的RelativeLayout.LayoutParams.
动画两个视图交换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); }
我已经在这里进行了几个小时的搜索并梳理了TransitionManager代码,但无法看到如何检测更改.我更喜欢能够在CollageCanvasAperture中检测到动画结束,但是看不到要应用的任何相关侦听器.
我想我可以在执行动画之前提供目标LayoutParams的视图,然后视图可以监听大小&位置变化,直到匹配……?
解决方法
因此事实证明,为这些“自动”转换添加侦听器非常简单.
而不是使用:TransitionManager.beginDelayedTransition(mApertureGroup);
您需要确定在调用beginDelayedTransition并调用TransitionManager.go()时正在使用哪个自动Transition.
我的视图转换使用了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);