关于安卓项目里做个可爱的动画效果

感觉很少看到安卓项目有丝滑的动画效果,安卓动画相对于其他平台可能有一些挑战,很多UI美化也只注重了改变格局分布和颜色???(新手勿喷)简单做了个安卓动画效果…

效果

​​​​在这里插入图片描述

动画效果

动画效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

犯错处

首先先说明一下本人犯错的地方:

public with rotationY(long duration, float... values) {
            return rotationY(duration, values);
        }

rotationY(duration, values) 调用了自己(递归),导致无限递归调用,导致运行成功后闪退。

上下文代码:

public with rotationX(long duration, float... values) {
            return rotationX(duration, null, values);
        }

        public with rotationX(long duration, Interpolator mInterpolator, float... values) {
            return rotationX(0, duration, mInterpolator, values);
        }

        public with rotationX(long waitTime, long duration, float... values) {
            return rotationX(waitTime, duration, null, values);
        }

        public with rotationX(long waitTime, long duration, Interpolator mInterpolator, float... values) {
            ObjectAnimator rotationX = ObjectAnimator.ofFloat(mView, "rotationX", values);
            rotationX.setDuration(duration);
            if (isLoop) {
                rotationX.setRepeatCount(ValueAnimator.INFINITE);
            }
            if (mInterpolator != null) {
                rotationX.setInterpolator(mInterpolator);
            }
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.setStartDelay(waitTime);
            animatorSet.play(rotationX);
            Map<String, Object> map = new HashMap<>();
            map.put("type", AnimHelper_Anim);
            map.put("anim", animatorSet);
            mList.add(map);
            return this;
        }

        public with rotationY(long duration, float... values) {
            return rotationY(0, duration, null, values);  // 默认等待时间为0,使用默认插值器
        }

        public with rotationY(long duration, Interpolator mInterpolator, float... values) {
            return rotationY(0, duration, mInterpolator, values);
        }

        public with rotationY(long waitTime, long duration, float... values) {
            return rotationY(waitTime, duration, null, values);
        }

        public with rotationY(long waitTime, long duration, Interpolator mInterpolator, float... values) {
            ObjectAnimator rotationY = ObjectAnimator.ofFloat(mView, "rotationY", values);
            rotationY.setDuration(duration);
            if (isLoop) {
                rotationY.setRepeatCount(ValueAnimator.INFINITE);
            }
            if (mInterpolator != null) {
                rotationY.setInterpolator(mInterpolator);
            }
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.setStartDelay(waitTime);
            animatorSet.play(rotationY);
            Map<String, Object> map = new HashMap<>();
            map.put("type", AnimHelper_Anim);
            map.put("anim", animatorSet);
            mList.add(map);
            return this;
        }

旋转动画的核心原理

ObjectAnimator 是 Android 提供的一个类,用于对视图对象(如 View)的属性进行动画处理。在这个例子中,使用了 rotationX 和 rotationY 属性来实现绕 X 轴和 Y 轴的旋转效果。

AnimatorSet 是一个容器,用于同时播放多个动画。在这段代码中,通过 AnimatorSet 来控制动画的播放顺序和延迟。

Interpolator 用于设置动画的插值器,控制动画的进度变化方式(如匀速、加速、减速等)。

ValueAnimator.INFINITE 表示动画将会无限循环。

这些方法是一个链式调用的设计,使得可以灵活地配置旋转动画的各种属性,如持续时间、等待时间、插值器、旋转角度等。

但是…我们将递归(调用自己)的方法改成调用别的参数

public with rotationY(long duration, float... values) {
    return rotationY(0, duration, null, values);  // 默认等待时间为0,使用默认插值器
}

这样,rotationY(long duration, float… values) 会调用 rotationY(long waitTime, long duration, Interpolator mInterpolator, float… values) 方法,并传递合适的默认参数这将避免递归调用,从而解决闪退问题~

动画步骤:

添加MAnim 库
步骤 1: 将 JitPack 仓库添加到你的构建文件中。
具体来说,你需要在项目的根目录下的 build.gradle 文件中的 allprojects 块里,添加 JitPack 的仓库地址。这样做之后,Gradle 就可以从 JitPack 仓库下载依赖的库。

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }  // 添加这一行
    }
}

步骤二:添加依赖
在 build.gradle 文件的 dependencies 部分,添加 MAnim 库的依赖:

dependencies {
    implementation 'com.gitee.mengpeng920223:MAnim:V1.1.0'
}

这样就可以在项目中使用 MAnim 库了

V1.1.0 与 V1.0.0 的区别

(通过拷打GPT我们可以知道)

与 V1.0.0 版本相比,V1.1.0 引入了以下更新:

插值器(Interpolator) 的支持:在 V1.1.0 中,你可以自定义动画的插值器,控制动画的速度曲线。
修复和优化:V1.1.0 对一些动画进行了优化和修正。
新增动画类型:添加了 V1.0.0 中没有的动画效果,包括 translationXY、scaleXY 和 rotationXY 等。
动画名称 动画 V1.0.0 动画 V1.1.0
-XY轴中间的某条线称线方向移动 translationYX
XY轴中间的某条线称线方向移动 translationXY
X轴方向移动 translationX translationX
X轴缩放 scaleX scaleX
Y轴方向移动 translationY translationY
Y轴缩放 scaleY scaleY
整体缩放 scaleXY
绕X轴和Y轴的中间的某条线称线旋转 rotationXY
绕X轴旋转 rotationX rotationX
绕Y轴旋转 rotationY rotationY
绕Z轴旋转 rotation rotation
透明度 alpha alpha
translationYX 和 translationXY 动画的差异:在 V1.1.0 中,translationXY 动画不再局限于对称线移动,而是可以自由指定末尾的位置。

scaleXY 动画的变化:V1.1.0 中 scaleXY 动画支持单独控制 X 和 Y 轴的缩放倍数。

rotationXY 动画的变化:V1.1.0 中 rotationXY 动画支持指定旋转轴线,而不再局限于中心对称线。

V1.1.0 用法
如果你想按照顺序执行多个动画,可以使用链式调用:

MAnim.getInstance()
    .with(imageView)
    .scaleX(2000, 1f, 3f, 1f)
    .scaleY(2000, 1f, 4f, 1f)
    .scaleXY(2000, floatArrayOf(1f, 3f, 1f), floatArrayOf(1f, 4f, 1f))
    .alpha(2000, 1f, 0.1f, 1f)
    .rotationX(2000, 0f, 360f, 0f)
    .rotationY(2000, 0f, 360f, 0f)
    .rotationXY(2000, floatArrayOf(0f, 360f, 0f), floatArrayOf(0f, 120f, 0f))
    .rotation(2000, 0f, 720f, 0f)
    .translationX(2000, 0f, 300f, -300f, 0f)
    .translationY(2000, 0f, 300f, -300f, 0f)
    .translationXY(2000, floatArrayOf(0f, 360f, 0f), floatArrayOf(0f, 120f, 0f))
    .start();

循环播放动画
如果想让动画循环播放,可以在初始化动画时指定 true 来启用循环:

MAnim.getInstance()
    .with(imageView, true) // 第二个参数是是否循环播放
    .scaleX(2000, 1f, 3f, 1f)
    .start();

动画执行完后的回调
如果你想在每段动画执行完后执行一些操作,可以使用 call 的回调方法,并且加上自己的插值器:

动画效果

MAnim.getInstance()
    .with(imageView)
    .scaleX(2000, mInterpolator, 1f, 3f, 1f)
    .call {
        // 执行动画后的操作
        ...
    }
    .scaleY(2000, mInterpolator, 1f, 4f, 1f)
    .call {
        // 执行动画后的操作
        ...
    }
    .start();

同时执行多个动画
你可以让多个动画并行执行,比如同时执行缩放和透明度动画:

MAnim.getInstance()
    .with(imageView)
    .scaleXY(2000, mInterpolator, floatArrayOf(1f, 3f, 1f), floatArrayOf(1f, 4f, 1f))
    .start();

MAnim.getInstance()
    .with(imageView)
    .alpha(2000, mInterpolator, 1f, 0.1f, 1f)
    .start();

MAnim.getInstance()
    .with(imageView)
    .rotationX(2000, mInterpolator, 0f, 360f, 0f)
    .start();

通过使用 MAnim,你可以很方便地在 Android 项目中实现各种动画效果,并且能够通过简单的 API 控制动画的顺序、循环、插值器等。

博客链接:https://blog.csdn.net/2201_75573729/article/details/144517744?sharetype=blogdetail&sharerId=144517744&sharerefer=PC&sharesource=2201_75573729&spm=1011.2480.3001.8118

——黄馨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值