这里没有废话之先上效果图。

这里没有废话之思路描述
1.确定小圆所在大圆的圆心及轨迹
2.根据圆心及小圆所在位置确定运动轨迹
3.跟着轨迹High起来
这里没有废话之核心代码
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//小球分布圆
paint.reset();
// paint.setStyle(Paint.Style.STROKE);
// canvas.drawCircle(w / 2, h / 2, w / 3, paint);
paint.setStyle(Paint.Style.FILL);
paint.setShader(linearGradient[linearGradient.length - 1]);
//中心小圆
canvas.drawCircle(ballPos[ballPos.length - 1][0], ballPos[ballPos.length - 1][1], sballradius, paint);
//画小球
for (int i = 0; i < ballCount; i++) {
float x = ballPos[i][0];
float y = ballPos[i][1];
paint.setShader(linearGradient[i]);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(x, y, sballradius, paint);
// if (i < paths.length) {
// paint.setShader(null);
// paint.setStyle(Paint.Style.STROKE);
// canvas.drawPath(paths[i], paint);
// }
}
//开始动画
float l;
switch (step) {
case 0:
pathMeasure.setPath(paths[0], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * offset, pos, tan);
ballPos[0][0] = pos[0];
ballPos[0][1] = pos[1];
pathMeasure.setPath(paths[ballPos.length - 1], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * (1 - offset1), pos, tan);
ballPos[ballPos.length - 1][0] = pos[0];
ballPos[ballPos.length - 1][1] = pos[1];
// Log.e("fx","l-->"+l+"pos"+Arrays.toString(pos)+"offset-->"+offset1);
break;
case 1:
// pathMeasure.setPath(paths[step], false);
// l = pathMeasure.getLength();
// pathMeasure.getPosTan(l * offset, pos, tan);
// ballPos[step][0] = pos[0];
// ballPos[step][1] = pos[1];
//// Log.e("fx_1","l-->"+l+"pos"+Arrays.toString(pos)+"offset-->"+offset);
// pathMeasure.setPath(paths[step - 1], false);
// l = pathMeasure.getLength();
// pathMeasure.getPosTan(l * (1-offset1), pos, tan);
// ballPos[step - 1][0] = pos[0];
// ballPos[step - 1][1] = pos[1];
// Log.e("fx_1","l-->"+l+"pos"+Arrays.toString(pos)+"offset1-->"+offset1);
case 2:
case 3:
case 4:
case 5:
pathMeasure.setPath(paths[step], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * offset, pos, tan);
ballPos[step][0] = pos[0];
ballPos[step][1] = pos[1];
pathMeasure.setPath(paths[step - 1], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * (1 - offset1), pos, tan);
ballPos[step - 1][0] = pos[0];
ballPos[step - 1][1] = pos[1];
break;
case 6:
pathMeasure.setPath(paths[step], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * offset, pos, tan);
ballPos[step][0] = pos[0];
ballPos[step][1] = pos[1];
pathMeasure.setPath(paths[0], false);
l = pathMeasure.getLength();
pathMeasure.getPosTan(l * (1 - offset1), pos, tan);
ballPos[0][1] = pos[1];
break;
}
//
Log.i("fx_ondraw_" + (ballPos.length - 1), Arrays.toString(ballPos[ballPos.length - 1]));
Log.i("fx_ondraw_0", Arrays.toString(ballPos[0]));
Log.i("fx_ondraw_1", Arrays.toString(ballPos[1]) + "step-->" + step);
}
这里没有废话之总结
1.已知半径,角度 求圆上任意一点。
2.path 及 pathmeasure用法
3.贝塞尔曲线
4.ValueAnimator
这里没有废话之鸣谢
感谢https://www.aconvert.com/cn/帮我转了gif。
网友评论