
我正在尝试通过更新显示之前调用TransitionManager.beginDelayedTransition(vIEwGroup,new autoTransition())来使显示平滑更新.但是我发现有时我会快速更新显示内容,而Android会感到困惑.
因此,我在autoTransition中添加了一个TransitionListener,其中transitionend()回叫,表示过渡已完成,这时我将动画设置为屏幕的新状态.但是我发现通常甚至都不会调用它.
是否有某种方法可以在a)转换结束或b)首先从不调用转换时回调回调?
更多信息:
我正在使用Xamarin.AndroID.我有一段看起来像这样的代码来启动转换:
if (animated && vIEwGroup != null && Utils.API19PlusKitkat) { App.Log("** Beginning animation."); var Transition = new autoTransition(); Transition.AddListener(new TransitionListener(this)); TransitionManager.BeginDelayedTransition(vIEwGroup, Transition);}TransitionListener很简单:
public class TransitionListener : java.lang.Object, Transition.ITransitionListener { Readonly TreeNode owner; public TransitionListener(TreeNode owner) { this.owner = owner; } public voID Ontransitionend(Transition Transition) { App.Log("**** TransitionListener: Transition End."); owner.FinishTransition(); } public voID OnTransitionCancel(Transition Transition) {} public voID OnTransitionPause(Transition Transition) {} public voID OnTransitionResume(Transition Transition) {} public voID OnTransitionStart(Transition Transition) { App.Log("**** TransitionListener: Transition Start."); }}当我查看应用程序日志时,会看到很多“开始动画”的案例,但很少见到“过渡开始”或“过渡结束”的情况(目前我没有看到任何实例,但有时我已经看到它发生了在日志中).
解决方法:
Upd2:
我想,我现在明白了.经过2天没有结果的尝试,我设法解决了这个问题.
仅当屏幕上有要更新的内容时,TransitionManager.beginDelayedTransition()才会触发某些内容.
例如,如果您将OnClick中的带有TransitionManager.beginDelayedTransition()的setonClickListener设置为具有不带选择器的自定义背景的按钮(androID:background =“#000”,而不是默认选择器),则什么都不会发生,则过渡将不会开始(如您所见).同时,如果您将相同的OnClickListener分配给默认样式的按钮(即以选择器为背景)-过渡将立即开始.
同样,如果在调用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);}该代码段将正常工作,因为它应该:
但是,一旦删除了“可见性”设置器,Transition就会添加到TransitionManager的待办事项列表中,并且不会执行(方法名称显示-可能会延迟).并且仅在下一次UI更改期间执行:
在此示例中,我删除了setVisibility()-您可以看到结果:仅在单击以Selector为背景的按钮(即发生UI更改)后,“动画”(在我的情况下仅为Toasts)才开始.
因此,解决方法将是-“确保在调用TransitionManager.beginDelayedTransition()之后有一些UI更改”.
希望对您有帮助
附言但是,在TransitionManager.beginDelayedTransition()之后编写的TransitionManager.go()无法正常工作,这有点奇怪.我在这里找到的唯一解决方法是将其放在ontransitionend内以进行延迟的转换.
Upd1:
首先想到的是它可能与Xamarin有关.然后我发现了两个在Xamarin.AndroID中使用BeginDelayedTransition的示例:xamarin/monodroid-samples和garuma/Moyeu.
要检查您的问题是否与Xamarin.AndroID有关-我建议调试这两个项目,以查看TransitionListener是否触发Transition-events.
这两个示例都使用带有一个参数(vIEwGroup)的TransitionManager.beginDelayedTransition().检查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()并将其添加到其中.
如果有效,那么我们将不得不在您的代码中查找问题.如果它不起作用-很好.那么,大概是我们发现了一个系统错误,可以将其归档.
总结以上是内存溢出为你收集整理的为什么我的Android过渡会忽略TransitionListener?全部内容,希望文章能够帮你解决为什么我的Android过渡会忽略TransitionListener?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)