Upd2:
我想,我现在明白了。经过两天无果的尝试后,我成功重现了这个问题。
TransitionManager.beginDelayedTransition()
会点燃一些东西only当屏幕上有需要更新的内容时。
例如,如果您setOnClickListener
with TransitionManager.beginDelayedTransition()
in OnClick
到没有选择器的具有自定义背景的按钮(android:background="#000"
,而不是默认选择器)-什么也不会发生,Transition
根本不会启动(正如您在案例中看到的那样)。同时,如果您分配相同的OnClickListener
到默认样式的按钮(即以选择器作为背景)-Transition
will立即开始。
同样,如果您之后进行一些 UI 更改TransitionManager.beginDelayedTransition()
被称为:
public void changeScene(View v){
AutoTransition autoTransition = new AutoTransition();
autoTransition.setDuration(3000);
autoTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
Toast.makeText(MainActivity.this, "start", Toast.LENGTH_SHORT).show();
}
@Override
public void onTransitionEnd(Transition transition) {
Toast.makeText(MainActivity.this, "end", Toast.LENGTH_SHORT).show();
}
@Override
public void onTransitionCancel(Transition transition) {}
@Override
public void onTransitionPause(Transition transition) {}
@Override
public void onTransitionResume(Transition transition) {}
});
TransitionManager.beginDelayedTransition(container, autoTransition);
findViewById(R.id.btn1).setVisibility(
(findViewById(R.id.btn1).getVisibility()) == View.VISIBLE?
View.INVISIBLE : View.VISIBLE);
}
这将代码片段将工作,因为它应该:
![enter image description here](https://i.stack.imgur.com/iZf4b.gif)
但是,一旦您删除了可见性的设置器,过渡就会添加到backlog of the TransitionManager
并且没有执行(方法的名称说 - 它可能是delayed)。并且它只会在下一次 UI 更改期间执行:
![enter image description here](https://i.stack.imgur.com/6iRZO.gif)
在这个例子中,我删除了setVisibility()
- 你可以看到结果:“动画”(在我的例子中只是 Toasts)仅在我单击以选择器为背景的按钮后才开始(即发生 UI 更改)。
所以解决办法是——“确保在您调用后有一些 UI 更改TransitionManager.beginDelayedTransition()
".
我希望,它有帮助
附:不过有点奇怪的是TransitionManager.go()
,写在之后TransitionManager.beginDelayedTransition()
,行不通。我在这里找到的唯一解决方法是将其放入其中onTransitionEnd
为了延迟过渡。
Upd1:
首先想到的是它可能与 Xamarin 有关。然后我找到了两个使用的例子BeginDelayedTransition
在 Xamarin.Android 中:xamarin/monodroid-样本 and 加鲁马/莫约。
要检查您的问题是否与 Xamarin.Android 相关 - 我建议调试这 2 个项目以查看是否TransitionListener
触发转换事件。
两个例子都使用TransitionManager.beginDelayedTransition()
带有一个参数(viewGroup)。检查源代码 of TransitionManager
显示,该 1 参数方法正在调用beginDelayedTransition(sceneRoot, null);
public static void beginDelayedTransition(final ViewGroup sceneRoot) {
beginDelayedTransition(sceneRoot, null);
}
并将 null 替换为sDefaultTransition
:
private static Transition sDefaultTransition = new AutoTransition();
....
public static void More ...beginDelayedTransition(final ViewGroup sceneRoot, Transition transition) {
if (!sPendingTransitions.contains(sceneRoot) && sceneRoot.isLaidOut()) {
if (Transition.DBG) {
Log.d(LOG_TAG, "beginDelayedTransition: root, transition = " +
sceneRoot + ", " + transition);
}
sPendingTransitions.add(sceneRoot);
if (transition == null) {
transition = sDefaultTransition;
}
final Transition transitionClone = transition.clone();
sceneChangeSetup(sceneRoot, transitionClone);
Scene.setCurrentScene(sceneRoot, null);
sceneChangeRunTransition(sceneRoot, transitionClone);
}
}
所以要调试它,你必须获得默认值TransactionManager.getDefaultTransition()
并添加你的TransitionListener
进去。
如果它有效 - 那么我们必须在您的代码中找到问题。如果它不起作用 - 好吧..然后,大概我们发现了一个系统错误,我们可以将其归档。