package com.github.lazylibrary.util; /** * Copyright 2014 Zhenguo Jin (jinzhenguo1990@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.CycleInterpolator; import android.view.animation.TranslateAnimation; /** * 视图动画工具箱,提供简单的控制视图的动画的工具方法 * * @author zhenguo */ public final class ViewAnimationUtils { /** * Don't let anyone instantiate this class. */ private ViewAnimationUtils() { throw new Error("Do not need instantiate!"); } // /** // * 默认动画持续时间 // */ // public static final long DEFAULT_ANIMATION_DURATION = 300; /* * ************************************************************* 视图透明度渐变动画 * ******************************************************************** */ /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)) * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 * @param durationMillis 持续时间,毫秒 * @param animationListener 动画监听器 */ public static void invisibleViewByAlpha(final View view, long durationMillis, final boolean isBanClick, final AnimationListener animationListener) { if (view.getVisibility() != View.INVISIBLE) { view.setVisibility(View.INVISIBLE); AlphaAnimation hiddenAlphaAnimation = AnimationUtils .getHiddenAlphaAnimation(durationMillis); hiddenAlphaAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (isBanClick) { view.setClickable(false); } if (animationListener != null) { animationListener.onAnimationStart(animation); } } @Override public void onAnimationRepeat(Animation animation) { if (animationListener != null) { animationListener.onAnimationRepeat(animation); } } @Override public void onAnimationEnd(Animation animation) { if (isBanClick) { view.setClickable(true); } if (animationListener != null) { animationListener.onAnimationEnd(animation); } } }); view.startAnimation(hiddenAlphaAnimation); } } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param animationListener 动画监听器 */ public static void invisibleViewByAlpha(final View view, long durationMillis, final AnimationListener animationListener) { invisibleViewByAlpha(view, durationMillis, false, animationListener); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void invisibleViewByAlpha(final View view, long durationMillis, boolean isBanClick) { invisibleViewByAlpha(view, durationMillis, isBanClick, null); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 */ public static void invisibleViewByAlpha(final View view, long durationMillis) { invisibleViewByAlpha(view, durationMillis, false, null); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 * @param animationListener 动画监听器 */ public static void invisibleViewByAlpha(final View view, boolean isBanClick, final AnimationListener animationListener) { invisibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, animationListener); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param animationListener 动画监听器 */ public static void invisibleViewByAlpha(final View view, final AnimationListener animationListener) { invisibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, animationListener); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void invisibleViewByAlpha(final View view, boolean isBanClick) { invisibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, null); } /** * 将给定视图渐渐隐去(view.setVisibility(View.INVISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 */ public static void invisibleViewByAlpha(final View view) { invisibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, null); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param isBanClick 在执行动画的过程中是否禁止点击 * @param animationListener 动画监听器 */ public static void goneViewByAlpha(final View view, long durationMillis, final boolean isBanClick, final AnimationListener animationListener) { if (view.getVisibility() != View.GONE) { view.setVisibility(View.GONE); AlphaAnimation hiddenAlphaAnimation = AnimationUtils .getHiddenAlphaAnimation(durationMillis); hiddenAlphaAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (isBanClick) { view.setClickable(false); } if (animationListener != null) { animationListener.onAnimationStart(animation); } } @Override public void onAnimationRepeat(Animation animation) { if (animationListener != null) { animationListener.onAnimationRepeat(animation); } } @Override public void onAnimationEnd(Animation animation) { if (isBanClick) { view.setClickable(true); } if (animationListener != null) { animationListener.onAnimationEnd(animation); } } }); view.startAnimation(hiddenAlphaAnimation); } } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param animationListener 动画监听器 */ public static void goneViewByAlpha(final View view, long durationMillis, final AnimationListener animationListener) { goneViewByAlpha(view, durationMillis, false, animationListener); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void goneViewByAlpha(final View view, long durationMillis, final boolean isBanClick) { goneViewByAlpha(view, durationMillis, isBanClick, null); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 */ public static void goneViewByAlpha(final View view, long durationMillis) { goneViewByAlpha(view, durationMillis, false, null); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 * @param animationListener 动画监听器 */ public static void goneViewByAlpha(final View view, final boolean isBanClick, final AnimationListener animationListener) { goneViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, animationListener); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param animationListener 动画监听器 */ public static void goneViewByAlpha(final View view, final AnimationListener animationListener) { goneViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, animationListener); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void goneViewByAlpha(final View view, final boolean isBanClick) { goneViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, null); } /** * 将给定视图渐渐隐去最后从界面中移除(view.setVisibility(View.GONE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 */ public static void goneViewByAlpha(final View view) { goneViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, null); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param isBanClick 在执行动画的过程中是否禁止点击 * @param animationListener 动画监听器 */ public static void visibleViewByAlpha(final View view, long durationMillis, final boolean isBanClick, final AnimationListener animationListener) { if (view.getVisibility() != View.VISIBLE) { view.setVisibility(View.VISIBLE); AlphaAnimation showAlphaAnimation = AnimationUtils .getShowAlphaAnimation(durationMillis); showAlphaAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (isBanClick) { view.setClickable(false); } if (animationListener != null) { animationListener.onAnimationStart(animation); } } @Override public void onAnimationRepeat(Animation animation) { if (animationListener != null) { animationListener.onAnimationRepeat(animation); } } @Override public void onAnimationEnd(Animation animation) { if (isBanClick) { view.setClickable(true); } if (animationListener != null) { animationListener.onAnimationEnd(animation); } } }); view.startAnimation(showAlphaAnimation); } } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param animationListener 动画监听器 */ public static void visibleViewByAlpha(final View view, long durationMillis, final AnimationListener animationListener) { visibleViewByAlpha(view, durationMillis, false, animationListener); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void visibleViewByAlpha(final View view, long durationMillis, final boolean isBanClick) { visibleViewByAlpha(view, durationMillis, isBanClick, null); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)) * * @param view 被处理的视图 * @param durationMillis 持续时间,毫秒 */ public static void visibleViewByAlpha(final View view, long durationMillis) { visibleViewByAlpha(view, durationMillis, false, null); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param animationListener 动画监听器 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void visibleViewByAlpha(final View view, final boolean isBanClick, final AnimationListener animationListener) { visibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, animationListener); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param animationListener 动画监听器 */ public static void visibleViewByAlpha(final View view, final AnimationListener animationListener) { visibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, animationListener); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void visibleViewByAlpha(final View view, final boolean isBanClick) { visibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, isBanClick, null); } /** * 将给定视图渐渐显示出来(view.setVisibility(View.VISIBLE)), * 默认的持续时间为DEFAULT_ALPHA_ANIMATION_DURATION * * @param view 被处理的视图 */ public static void visibleViewByAlpha(final View view) { visibleViewByAlpha(view, AnimationUtils.DEFAULT_ANIMATION_DURATION, false, null); } /* * ************************************************************* 视图移动动画 * ******************************************************************** */ /** * 视图移动 * * @param view 要移动的视图 * @param fromXDelta X轴开始坐标 * @param toXDelta X轴结束坐标 * @param fromYDelta Y轴开始坐标 * @param toYDelta Y轴结束坐标 * @param cycles 重复 * @param durationMillis 持续时间 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void translate(final View view, float fromXDelta, float toXDelta, float fromYDelta, float toYDelta, float cycles, long durationMillis, final boolean isBanClick) { TranslateAnimation translateAnimation = new TranslateAnimation( fromXDelta, toXDelta, fromYDelta, toYDelta); translateAnimation.setDuration(durationMillis); if (cycles > 0.0) { translateAnimation.setInterpolator(new CycleInterpolator(cycles)); } translateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (isBanClick) { view.setClickable(false); } } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (isBanClick) { view.setClickable(true); } } }); view.startAnimation(translateAnimation); } /** * 视图移动 * * @param view 要移动的视图 * @param fromXDelta X轴开始坐标 * @param toXDelta X轴结束坐标 * @param fromYDelta Y轴开始坐标 * @param toYDelta Y轴结束坐标 * @param cycles 重复 * @param durationMillis 持续时间 */ public static void translate(final View view, float fromXDelta, float toXDelta, float fromYDelta, float toYDelta, float cycles, long durationMillis) { translate(view, fromXDelta, toXDelta, fromYDelta, toYDelta, cycles, durationMillis, false); } /** * 视图摇晃 * * @param view 要摇动的视图 * @param fromXDelta X轴开始坐标 * @param toXDelta X轴结束坐标 * @param cycles 重复次数 * @param durationMillis 持续时间 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void shake(View view, float fromXDelta, float toXDelta, float cycles, long durationMillis, final boolean isBanClick) { translate(view, fromXDelta, toXDelta, 0.0f, 0.0f, cycles, durationMillis, isBanClick); } /** * 视图摇晃 * * @param view 要摇动的视图 * @param fromXDelta X轴开始坐标 * @param toXDelta X轴结束坐标 * @param cycles 重复次数 * @param durationMillis 持续时间 */ public static void shake(View view, float fromXDelta, float toXDelta, float cycles, long durationMillis) { translate(view, fromXDelta, toXDelta, 0.0f, 0.0f, cycles, durationMillis, false); } /** * 视图摇晃,默认摇晃幅度为10,重复7次 * * @param view view * @param cycles 重复次数 * @param durationMillis 持续时间 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void shake(View view, float cycles, long durationMillis, final boolean isBanClick) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, cycles, durationMillis, isBanClick); } /** * 视图摇晃,默认摇晃幅度为10,持续700毫秒 * * @param view view * @param cycles 重复次数 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void shake(View view, float cycles, final boolean isBanClick) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, cycles, 700, isBanClick); } /** * 视图摇晃,默认摇晃幅度为10 * * @param view view * @param cycles 重复次数 * @param durationMillis 持续时间 */ public static void shake(View view, float cycles, long durationMillis) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, cycles, durationMillis, false); } /** * 视图摇晃,默认摇晃幅度为10,重复7次 * * @param view view * @param durationMillis 持续时间 * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void shake(View view, long durationMillis, final boolean isBanClick) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, 7, durationMillis, isBanClick); } /** * 视图摇晃,默认摇晃幅度为10,持续700毫秒 * * @param view 要摇动的视图 * @param cycles 重复次数 */ public static void shake(View view, float cycles) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, cycles, 700, false); } /** * 视图摇晃,默认摇晃幅度为10,重复7次 * * @param view view * @param durationMillis 持续时间 */ public static void shake(View view, long durationMillis) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, 7, durationMillis, false); } /** * 视图摇晃,默认摇晃幅度为10,重复7次,持续700毫秒 * * @param view view * @param isBanClick 在执行动画的过程中是否禁止点击 */ public static void shake(View view, final boolean isBanClick) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, 7, 700, isBanClick); } /** * 视图摇晃,默认摇晃幅度为10,重复7次,持续700毫秒 * * @param view view */ public static void shake(View view) { translate(view, 0.0f, 10.0f, 0.0f, 0.0f, 7, 700, false); } }