为什么我的Android过渡会忽略TransitionListener?

为什么我的Android过渡会忽略TransitionListener?,第1张

概述我正在尝试通过更新显示之前调用TransitionManager.beginDelayedTransition(viewGroup,newAutoTransition())来使显示平滑更新.但是我发现有时我会快速更新显示内容,而Android会感到困惑.因此,我在AutoTransition中添加了一个TransitionListener,其中transitionEnd()回叫,表示过

我正在尝试通过更新显示之前调用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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1120568.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存