在此动画侦听器中执行回调的最佳方法是什么?

大卫

在很多地方,我发现自己在应用程序内外的内容逐渐淡出。

我决定创建一个名为Fade的助手。

淡入淡出有一个有问题的方法:

public class Fade {

    public static void hide(final View view, AnimatorListenerAdapter listener) {
        if (view.getVisibility() == View.VISIBLE) {
            view.animate().setDuration(DURATION);
            view.animate().alpha(0f).setListener(listener);
        }
    }

}

为了使Fade.hide可以按需要工作,我需要AnimationListenerAdapter在其onAnimationEnd方法中执行以下操作请注意,我之所以不只是这样做,是因为使用此帮助器的人应该能够自定义监听的开始时间,结束时间等。

view.setAlpha(1f);
view.setVisibility(View.INVISIBLE);
view.animate().setListener(null);

其中view引用了在此帮助程序的客户端上使用的View。

我认为这种行为是非常不希望的,这使我怀疑是否值得拥有帮助者。

我不能只是让使用帮助者的人进入AnimatorListenerAdapter,然后以某种方式将其塞入我自己的AnimatorListenerAdapter中。

我考虑过要进行以下操作,但这绝对是不可靠的:

public static void hide(final View view, Runnable endAction) {
    if (view.getVisibility() == View.VISIBLE) {
        view.animate().setDuration(DURATION);
        view.animate().alpha(0f).setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                view.setAlpha(1f);
                view.setVisibility(View.INVISIBLE);
                view.animate().setListener(null);

                endAction.run();
           }
        }
    }
}

这似乎很hacky,最终需要我做很多方法签名来解决所有的AnimatorListenerAdapter回调,例如onAnimationRepeat,onAnimationStart等。

有什么方法可以减轻这种情况,还是我应该减少代码气味并在进行大量衰落的任何类中创建相同的方法?

凯文·科波克

您可以做的是合成AnimatorListenerAdapter一个包装提供的侦听器并在完成所需工作后委派调用的合成例如:

public final class FadeHelper {
    public static void fade(final View view, Animator.AnimatorListener listener) {
        if (view.getVisibility() == View.VISIBLE) {

            // Create a composite listener and override onAnimationEnd()
            // to do your own thing, then call through to super to pass
            // the event to the provided listener.
            final Animator.AnimatorListener compositeListener = new CompositeAnimatorListenerAdapter(listener) {
                @Override
                public void onAnimationEnd(Animator animator) {
                    view.setAlpha(1f);
                    view.setVisibility(View.INVISIBLE);

                    // Not sure why this line is necessary?
                    view.animate().setListener(null);

                    // This passes the event to the original listener
                    super.onAnimationEnd(animator);
                }
            });

            view.animate()
                .setDuration(DURATION)
                .alpha(0f)
                .setListener(compositeListener);
        }
    }

    private static class CompositeAnimatorListenerAdapter implements Animator.AnimatorListener {
        private final Animator.AnimatorListener mDelegate;

        public CompositeAnimatorListenerAdapter(Animator.AnimatorListener delegate) {
            mDelegate = delegate;
        }

        @Override
        public void onAnimationStart(Animator animator) {
            if (mDelegate != null) {
                mDelegate.onAnimationStart(animator);
            }
        }

        @Override
        public void onAnimationEnd(Animator animator) {
            if (mDelegate != null) {
                mDelegate.onAnimationEnd(animator);
            }
        }

        @Override
        public void onAnimationCancel(Animator animator) {
            if (mDelegate != null) {
                mDelegate.onAnimationCancel(animator);
            }
        }

        @Override
        public void onAnimationRepeat(Animator animator) {
            if (mDelegate != null) {
                mDelegate.onAnimationRepeat(animator);
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ObservableOnSubscribe 回调中侦听器的生命周期是什么 - Rxjava

来自分类Dev

在C ++中实现回调的最佳方法是什么

来自分类Dev

在回调侦听器中设置imageview位图

来自分类Dev

断言在JUnit中调用了回调/侦听器

来自分类Dev

在回调侦听器中设置imageview位图

来自分类Dev

删除元素上的事件侦听器的最佳方法是什么?

来自分类Dev

Android侦听器/回调如何?

来自分类Dev

Android侦听器/回调如何?

来自分类Dev

查找在浏览器中调试JavaScript的侦听器的最快方法是什么?

来自分类Dev

Reactor中侦听器的主题是什么?

来自分类Dev

处理DialogFragment回调的最佳方法是什么?

来自分类Dev

为什么Generators的next函数不能成为事件侦听器的回调函数

来自分类Dev

在Dart中,仅在回调内部存在的集合/列表上“屈服”的最佳方法是什么?

来自分类Dev

当应用程序进入后台时,Firestore快照侦听器的最佳做法是什么?

来自分类Dev

将事件侦听器(在回调函数中)添加到生成的元素

来自分类Dev

如何从传递给侦听器的回调中访问状态挂钩值?

来自分类Dev

在点击侦听器回调中获取活动上下文

来自分类Dev

Dojo:在事件侦听器回调中维护对窗口小部件的引用

来自分类Dev

在事件侦听器回调中未调用Restify res.send()

来自分类Dev

具有回调参数的Javascript自定义函数要在具有不同参数的事件侦听器中执行吗?

来自分类Dev

用于JPA回调的Hibernate事件侦听器

来自分类Dev

dojo xhrPost进度(回调)事件侦听器?

来自分类Dev

活动到活动回调侦听器

来自分类Dev

活动到活动回调侦听器

来自分类Dev

回调侦听器始终返回null

来自分类Dev

回调侦听器无法正常工作

来自分类Dev

类内可重用的事件侦听器回调

来自分类Dev

在NodeJS中执行For之后的回调的最佳方法?

来自分类Dev

注册和注销注册侦听器以接收回调的正确方法是什么,即使活动不可见也是如此?

Related 相关文章

  1. 1

    ObservableOnSubscribe 回调中侦听器的生命周期是什么 - Rxjava

  2. 2

    在C ++中实现回调的最佳方法是什么

  3. 3

    在回调侦听器中设置imageview位图

  4. 4

    断言在JUnit中调用了回调/侦听器

  5. 5

    在回调侦听器中设置imageview位图

  6. 6

    删除元素上的事件侦听器的最佳方法是什么?

  7. 7

    Android侦听器/回调如何?

  8. 8

    Android侦听器/回调如何?

  9. 9

    查找在浏览器中调试JavaScript的侦听器的最快方法是什么?

  10. 10

    Reactor中侦听器的主题是什么?

  11. 11

    处理DialogFragment回调的最佳方法是什么?

  12. 12

    为什么Generators的next函数不能成为事件侦听器的回调函数

  13. 13

    在Dart中,仅在回调内部存在的集合/列表上“屈服”的最佳方法是什么?

  14. 14

    当应用程序进入后台时,Firestore快照侦听器的最佳做法是什么?

  15. 15

    将事件侦听器(在回调函数中)添加到生成的元素

  16. 16

    如何从传递给侦听器的回调中访问状态挂钩值?

  17. 17

    在点击侦听器回调中获取活动上下文

  18. 18

    Dojo:在事件侦听器回调中维护对窗口小部件的引用

  19. 19

    在事件侦听器回调中未调用Restify res.send()

  20. 20

    具有回调参数的Javascript自定义函数要在具有不同参数的事件侦听器中执行吗?

  21. 21

    用于JPA回调的Hibernate事件侦听器

  22. 22

    dojo xhrPost进度(回调)事件侦听器?

  23. 23

    活动到活动回调侦听器

  24. 24

    活动到活动回调侦听器

  25. 25

    回调侦听器始终返回null

  26. 26

    回调侦听器无法正常工作

  27. 27

    类内可重用的事件侦听器回调

  28. 28

    在NodeJS中执行For之后的回调的最佳方法?

  29. 29

    注册和注销注册侦听器以接收回调的正确方法是什么,即使活动不可见也是如此?

热门标签

归档