让我们荡起双桨,Android 小船波浪动画

响应公司设计德要求,需要一个小船再波浪上浮动德过渡页,不瞎bb了,效果图如下:



怎么样,效果还行把!

大体思路:

仔细观察可知,波浪为数学了正弦函数产生,小船再整个View中间,如果中间的位置处于波谷那么小船就上浮,否则就下沉,另外为了逼真,小船再中间靠右德相邻的位置的高度比中间位置德高度大,那么小船朝上,否则朝下。

关键代码:

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!mIsRun) {
return;
}
/**
* 小船画在中间的位置
*/
for (int i = 0; i < mWidth; i++) {
if (i == 0) {
mPath.moveTo(0, mWaveRealHeight * (float) Math.sin(mAngle));
} else {
float y = mWaveRealHeight * (float) Math.sin(i * (2 * Math.PI / mDense) + mAngle);
/**
* 取中间一段取的y值,控制小船俯仰以及上下浮动
*/
if (i == mWidth / 2) {
//中间点相邻点用于判断小船是网上还是往下还是保持平衡
float deltaY5 = mWaveRealHeight * (float) Math.sin((i + mThresholdWidth) * (2 * Math.PI / mDense) + mAngle);
mMatrix.postTranslate(mBoatStartX, -y/2 + mWaveRealHeight);
if (deltaY5 > y) {
mMatrix.postRotate(mUpDownAngle, mWidth / 2, mBoat.getHeight());
} else {
mMatrix.postRotate(-mUpDownAngle, mWidth / 2, mBoat.getHeight());
}
canvas.drawBitmap(mBoat, mMatrix, mPaintBoat);
mMatrix.reset();
}
mPath.lineTo(i, y);
}
}
canvas.translate(0, mBoat.getHeight() + mWaveRealHeight);
canvas.drawPath(mPath, mPaint);
mAngle += mSpeed;
mPath.reset();
invalidate();
}

通过改变mAngle的值也就是sin函数德初相角,造成波浪上下抖动,形成波浪向左移动的假象。另外通过Matrix的postRotate(),改变图片的旋转角度,形成小船俯仰的动画,通过Matrix的postTranslate形成小船上下的动画。

demo地址,喜欢德话给个星吧!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值