Android自定义View系列之正弦曲线

写在前面

最近在找工作,安装了某勾网 APP,登录后看到用户信息绿色背板那骚气的波浪。

《Android自定义View系列之正弦曲线》 某勾的波浪

让我看看性能如何,在开发者模式里开启了 GPU 渲染情况信息展示。

《Android自定义View系列之正弦曲线》 性能很好

好,自己也写一个。

百度了一下正弦曲线的画法

整条正弦曲线是由 N 多条竖线排列起来组合而成。
onDraw 代码如下:

// 振幅
int amplitude = 20;

int height = getHeight();
// 波长
int width = getWidth();
int index = 0;

while (index < width) {
    float endY = (float) (Math.sin((float) index / (float) width * 2f * Math.PI + mTheta) * (float) amplitude + height - amplitude);
    canvas.drawLine(index, 0, index, endY, mPaint);
    index++;
}

看下性能:

《Android自定义View系列之正弦曲线》 惨不忍睹

非常明显,百度上的文章抄来抄去,错了大家一起错,在 onDraw 方法里执行成百上千次 canvas.drawXXX 方法,性能不差才怪。

改良方法

我试着用 Path 绘制路径这个 API。onDraw 代码如下:

// 振幅
int amplitude = 20;

int height = getHeight();
// 波长
int width = getWidth();
int index = 0;

mPath.reset();
mPath.moveTo(0, 0);
while (index <= width) {
    float endY = (float) (Math.sin((float) index / (float) width * 2f * Math.PI + mTheta)
          * (float) amplitude + height - amplitude);
    mPath.lineTo(index, endY);
    // Log.e("xxx", String.format("(%.4f, %.4f)", (float) index, endY));
    index++;
}
mPath.lineTo(index - 1, 0);
mPath.close();

canvas.drawPath(mPath, mPaint);

看下性能如何:

《Android自定义View系列之正弦曲线》 还可以

onDraw 里只有一次 drawXXX 方法,性能已经达标,接下来定时修改那个 mTheta 变量,波浪就会动起来了。

总结

百度虽好,可不能照搬照抄。

源码放置了自定义 View 集合,找到 WaveView 那个类就可以看到了。
GitHub 地址

    原文作者:广州小拳拳
    原文地址: https://www.jianshu.com/p/e38c76de0631
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞