响应公司设计德要求,需要一个小船再波浪上浮动德过渡页,不瞎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形成小船上下的动画。
,喜欢德话给个星吧!