自定义View中的正弦波绘制以及动画技巧
正弦波公式:
ƒ(x) = a * sin(x + x0) + b
公式中:
a: 决定正弦函数振动幅度的大小;
x0:表示x开始比0拖后的弧度值;
b:表示函数偏离X轴的距离;
上述描述来自百度百科,因为本人数学也是渣渣
OK,下面我们来看下GIF中正弦波在Android中的绘制以及动画
目标 一: 绘制静态的正弦曲线,
正弦曲线可以看成上述公式中,无数个在 函数ƒ(x) = a * sin(x + x0) + b 中的点连起来的点,点构成了线条
在Android中,我们可以用canvas中的API,
public void drawLine(float startX, float startY, float stopX, float stopY,
@NonNull Paint paint) {
native_drawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance());
}
绘制直线的方法来找出view的宽度范围内,所有符合fx正弦波函数的点
这样静态的静态曲线就绘制出来了,
然后就是然正弦波静态的,动起来,
无线动的实现,利用属性动画驱动器valueanimitor来实现
public void waveAnim() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0F, 1.F);
valueAnimator.setDuration(2000);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float aFloat = Float.valueOf(animation.getAnimatedValue().toString());
//核心代码,重要的是在动画的过程中改变正弦波的相位,从0到360无限变化就可以实现正弦波的移动
wavePhase = 360.F * aFloat;
invalidate();
}
});
valueAnimator.start();
}
这样就结束了,总要的在这里,源代码下载地址: