在很多地方,我发现自己在应用程序内外的内容逐渐淡出。
我决定创建一个名为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] 删除。
我来说两句