更新2:
我想,我现在明白了。经过 2 天无果而终的尝试,我设法重现了这个问题。
TransitionManager.beginDelayedTransition()只有会在屏幕上有要更新的内容时触发。
例如,如果您将 OnClick 中的 setOnClickListener 和 TransitionManager.beginDelayedTransition() 与没有选择器的自定义背景按钮(android:background="#000",而不是默认选择器)一起使用 - 什么都不会发生,Transition 将无法启动完全没有(正如你在你的案例中看到的那样)。同时,如果您将相同的OnClickListener 分配给默认样式按钮(即选择器作为背景) - Transition 将立即启动。
同样,如果您在调用 TransitionManager.beginDelayedTransition() 后进行一些 UI 更改:
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);
}
这将使代码 sn-p 可以正常工作:
但是一旦你删除了可见性的设置器,Transition 就会添加到TransitionManager 的 backlog 中并且不会被执行(方法的名称说 - 它可能是 延迟的 em>)。它只会在下一次 UI 更改期间执行:
在此示例中,我删除了setVisibility() - 您可以看到结果:“动画”(在我的情况下只是 Toasts)仅在我单击带有 Selector 作为背景的按钮后才开始(即 UI-change发生)。
因此修复将是 - “确保在您调用 TransitionManager.beginDelayedTransition() 之后有一些 UI 更改”。
希望对你有帮助
附:不过有点奇怪,写在TransitionManager.beginDelayedTransition() 之后的TransitionManager.go() 不起作用。我在这里找到的唯一解决方法是将其放在 onTransitionEnd 中以进行延迟转换。
更新1:
首先想到的是它可能与 Xamarin 有关。然后我发现了两个在 Xamarin.Android 中使用BeginDelayedTransition 的示例:xamarin/monodroid-samples 和garuma/Moyeu。
要检查您的问题是否与 Xamarin.Android 有关 - 我建议调试这 2 个项目以查看 TransitionListener 是否触发转换事件。
两个示例都使用TransitionManager.beginDelayedTransition() 和一个参数(viewGroup)。检查TransitionManager 的source code 显示,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 添加到其中。
如果它有效 - 那么我们将不得不在您的代码中找到问题。如果它不起作用 - 好吧。然后,大概,我们发现了一个系统错误,我们可以提交。