如何封装可复用的Android淡入淡出动画函数?
嘿,很高兴帮你搞定这个动画封装复用的问题!首先得提一句你示例函数里的小细节:res_alfa 参数应该是float类型(比如0f表示完全透明,1f表示完全不透明),而不是String,不然编译会直接报错哦。接下来咱们一步步把淡入淡出封装成通用可复用的工具:
封装可复用的淡入淡出动画工具
1. 基础方案:Java静态工具类
最直接的方式是把动画逻辑封装到一个静态工具类里,这样项目里任何类都能轻松调用:
import android.view.View; import android.animation.ObjectAnimator; public class AnimationUtils { // 淡出动画:View逐渐变为透明 public static void fadeOut(View view, long duration) { ObjectAnimator fadeOutAnim = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 0f); fadeOutAnim.setDuration(duration); fadeOutAnim.start(); } // 淡入动画:View逐渐显示 public static void fadeIn(View view, long duration) { // 先设置View可见,不然动画效果会被隐藏状态覆盖 view.setVisibility(View.VISIBLE); ObjectAnimator fadeInAnim = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f); fadeInAnim.setDuration(duration); fadeInAnim.start(); } // 可选:带结束回调的版本,方便动画结束后执行后续操作(比如隐藏View) public static void fadeOutWithCallback(View view, long duration, Runnable onEnd) { ObjectAnimator fadeOutAnim = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 0f); fadeOutAnim.setDuration(duration); fadeOutAnim.addListener(new android.animation.Animator.AnimatorListener() { @Override public void onAnimationStart(android.animation.Animator animator) {} @Override public void onAnimationEnd(android.animation.Animator animator) { view.setVisibility(View.GONE); // 动画结束后隐藏View if (onEnd != null) { onEnd.run(); } } @Override public void onAnimationCancel(android.animation.Animator animator) {} @Override public void onAnimationRepeat(android.animation.Animator animator) {} }); fadeOutAnim.start(); } }
使用起来超级简单,在任何类里直接调用就行:
// 让TextView淡出,时长500毫秒 AnimationUtils.fadeOut(myTextView, 500); // 让ImageView淡入,时长300毫秒 AnimationUtils.fadeIn(myImageView, 300); // 淡出后执行额外操作,比如跳转页面 AnimationUtils.fadeOutWithCallback(myButton, 500, () -> { // 动画结束后要做的逻辑 });
2. 进阶方案:Kotlin View扩展函数
如果你的项目用Kotlin,还可以给View写扩展函数,调用起来更简洁直观:
import android.view.View import android.animation.ObjectAnimator fun View.fadeOut(duration: Long) { ObjectAnimator.ofFloat(this, "alpha", this.alpha, 0f).apply { setDuration(duration) start() } } fun View.fadeIn(duration: Long) { this.visibility = View.VISIBLE ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).apply { setDuration(duration) start() } } fun View.fadeOutWithCallback(duration: Long, onEnd: () -> Unit) { ObjectAnimator.ofFloat(this, "alpha", this.alpha, 0f).apply { setDuration(duration) addListener(object : android.animation.Animator.AnimatorListener { override fun onAnimationStart(animator: android.animation.Animator) {} override fun onAnimationEnd(animator: android.animation.Animator) { this@fadeOutWithCallback.visibility = View.GONE onEnd() } override fun onAnimationCancel(animator: android.animation.Animator) {} override fun onAnimationRepeat(animator: android.animation.Animator) {} }) start() } }
调用时直接在View对象上链式调用:
myTextView.fadeOut(500) myImageView.fadeIn(300) myButton.fadeOutWithCallback(500) { // 动画结束后的操作逻辑 }
3. 几个实用注意事项
- 确保调用动画时View已经完成初始化(比如在
onViewCreated或onResume之后调用,别在onCreate里直接调用,此时View可能还没加载完成) - 如果需要频繁重复使用同一动画,可以缓存动画对象,但一般情况下直接创建新的
ObjectAnimator对性能影响可以忽略 - 如果要实现更复杂的组合动画(比如淡入+缩放),可以用
AnimatorSet把多个动画组合起来,同样封装到工具类里即可
内容的提问来源于stack exchange,提问作者Shlomi Shaul
相关产品推荐
相关产品推荐

