Android:自绘动画实践——以 Tencent OS 录音机波形为例

本文介绍如何实现Android自绘动画,以Tencent OS录音机波形为例,探讨图形函数、渐变效果的绘制,以及动画优化。通过正弦函数计算波形,使用PorterDuffXfermode实现渐变,最终达到类似Bugly博客中的酷炫效果。
摘要由CSDN通过智能技术生成

【转载请注明出处】
作者:DrkCore (http://blog.csdn.net/DrkCore)
原文链接:(http://blog.csdn.net/drkcore/article/details/51822818)

这几天因为毕业之类的七七八八的事情有些日子没写博客了,刚好近日看到了 Bugly 发布的一篇关于自绘动画的博客《Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例》,写的非常有深度但可惜没有放出源码,惊叹之余便有了亲自造个轮子的想法。

这是Bugly博客中给出的效果图,可以看到是非常的酷炫:
图片无法引用,如果想要查看效果的话可以到bugly公众号去查看原贴。

废话不多说,先放出效果图给大家看一下:

Demo效果

可以看到除了四处飞舞的小球和颜色不太对以外,大致的效果还是差不多的。

接下来让我们看看如何实现这些效果的。

当然,如果你想直接看代码可以直接看末尾。

图形函数

按照Bugly的博文中给出的公式我们首先在 Desmos 图形计算器上计算出需要绘制的图形,如下:

波形函数

我们可以看到一共有三条波形,红色和蓝色波是录音波形的上下轮廓,绿色的波形则在中间,其振幅是上下两条波形的五分之一。

虽然有三条波形但其实我们只需要一个函数,其他两条都可以通过对该函数进行简单的数学换算得到:

波形函数

用JAVA来表达也就是:

    /**
     * 计算波形函数中x对应的y值
     *
     * @param mapX   x值
     * @param offset 偏移量
     * @return
     */
    private double calcValue(float mapX, float offset) {
   
        double sinFunc = Math.sin(0.75 * Math.PI * mapX - offset * Math.PI);//这里的offset * Math.PI是偏移量φ
        double recessionFunc = Math.pow(4 / (4 + Math.pow(mapX, 4)), 2.5);
        return 0.5 * sinFunc * recessionFunc;
    }

正弦函数的公式是y=Asin(ωx+φ)+k,其中φ是偏移量,代码中通过 offset * Math.PI 来实现。这样我们只要在绘图的过程中将时间的流逝换算成偏移量即可实现波形的变换,配合Thread.sleep就可以倒腾出动画的效果。

图片中使用红色框图圈出的范围是我们关注的波形所在,取值如下:

x = [-2,2]
y = [-0.5,0.5]

显然所有的手机屏幕的尺寸都比这个范围大,因而我们需要将屏幕上的坐标点一一映射到这个区域之中,同时按照Bugly博客原文给出的思路我们只需要采样部分的点即可,映射的代码如下:

    //采样点的数量,越高越精细,
    //但高于一定限度后人眼察觉不出。
    static final int SAMPLING_SIZE = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值