Android画球轨迹
Android draw ball trail
我的应用程序中有一些球会飞过显示屏。他们按照我的意愿画画。但现在我想画出他们身后的踪迹
我能做的就是画canvas.drawPath
像下图这样的东西:
但这不是我想要的。它应该有这样的尖尾巴和渐变色:
我不知道怎么做。已尝试 BitmapShader
- 无法做出正确的事情。请帮忙。
代码:
首先显示的位置是Point
class:
class Point {
float x, y;
...
}
轨迹存储为 Point
的 queue:
private ConcurrentLinkedQueue<Point> trail;
不管怎么填,只要知道有大小限制即可:
trail.add(position);
if(trail.size() > TRAIL_MAX_COUNT) {
trail.remove();
}
绘图发生在 DrawTrail
方法中:
private void DrawTrail(Canvas canvas) {
trailPath.reset();
boolean isFirst = true;
for(Point p : trail) {
if(isFirst) {
trailPath.moveTo(p.x, p.y);
isFirst = false;
} else {
trailPath.lineTo(p.x, p.y);
}
}
canvas.drawPath(trailPath, trailPaint);
}
顺便说一下,trailPaint
真的很胖:)
trailPaint = new Paint();
trailPaint.setStyle(Paint.Style.STROKE);
trailPaint.setColor(color);
trailPaint.setStrokeWidth(radius * 2);
trailPaint.setAlpha(150);
我知道你想在球的路径上看到一个渐变,你可以使用这样的东西
int x1 = 0, y1 = 0, x2 = 0, y2 = 40;
Shader shader = new LinearGradient(0, 0, 0, 40, Color.WHITE, Color.BLACK, TileMode.CLAMP);
trailPaint = new Paint();
trailPaint.setShader(shader);
这就是您应该将 trailPaint 更改为的内容,看看它是否有效。
由here提供。
我找到了解决方案。不过还是觉得不是最好的
首先,我的 class 字段用于该任务。
static final int TRAIL_MAX_COUNT = 50; //maximum trail array size
static final int TRAIL_DRAW_POINT = 30; //number of points to split the trail for draw
private ConcurrentLinkedQueue<Point> trail;
private Paint[] trailPaints;
private float[][] trailPoss, trailTans;
private Path trailPath;
除了 trailPath
对象之外,我还使用 PathMeasure
对象将路径拆分为多个相等的部分。
填充轨迹数组对象后添加轨迹计算函数的调用
lastTrailAdd = now;
trail.add(pos.Copy());
if (trail.size() > TRAIL_MAX_COUNT) {
trail.remove();
}
FillTrail();
然后是我的FillTrail
函数。
private void FillTrail() {
trailPath.reset();
boolean isFirst = true;
for(Point p : trail) {
if(isFirst) {
trailPath.moveTo(p.x, p.y);
trailPoss[0][0] = p.x;
trailPoss[0][1] = p.y;
isFirst = false;
} else {
trailPath.lineTo(p.x, p.y);
}
}
PathMeasure path = new PathMeasure(trailPath, false);
float step = path.getLength() / TRAIL_DRAW_POINT;
for(int i=0; i<TRAIL_DRAW_POINT; i++) {
path.getPosTan(step * i, trailPoss[i], trailTans[i]);
}
}
画线分离了。下一个代码是绘图功能。
private void DrawTrail(Canvas canvas) {
if(trail.size() > 1) {
float prevWidthHalfX = 0f, prevWidthHalfY = 0f, prevX = 0f, prevY = 0f;
Path trailStepRect = new Path();
boolean isFirst = true;
for (int i = 0; i < TRAIL_DRAW_POINT; i++) {
float currWidthHalf = (float) (radius) * i / TRAIL_DRAW_POINT / 2f,
currWidthHalfX = currWidthHalf * trailTans[i][1],
currWidthHalfY = currWidthHalf * trailTans[i][0],
currX = trailPoss[i][0], currY = trailPoss[i][1];
if (!isFirst) {
trailStepRect.reset();
trailStepRect.moveTo(prevX - prevWidthHalfX, prevY + prevWidthHalfY);
trailStepRect.lineTo(prevX + prevWidthHalfX, prevY - prevWidthHalfY);
trailStepRect.lineTo(currX + currWidthHalfX, currY - currWidthHalfY);
trailStepRect.lineTo(currX - currWidthHalfX, currY + currWidthHalfY);
canvas.drawPath(trailStepRect, trailPaints[i]);
} else {
isFirst = false;
}
prevX = currX;
prevY = currY;
prevWidthHalfX = currWidthHalfX;
prevWidthHalfY = currWidthHalfY;
}
}
}
这个的要点是用不同的油漆来绘制轨迹。更接近球 - 更宽的轨迹。我想我会优化它,但它已经准备好了。
如果您想观看它的外观,只需安装 my app from google play。
我的应用程序中有一些球会飞过显示屏。他们按照我的意愿画画。但现在我想画出他们身后的踪迹
我能做的就是画canvas.drawPath
像下图这样的东西:
但这不是我想要的。它应该有这样的尖尾巴和渐变色:
我不知道怎么做。已尝试 BitmapShader
- 无法做出正确的事情。请帮忙。
代码:
首先显示的位置是Point
class:
class Point {
float x, y;
...
}
轨迹存储为 Point
的 queue:
private ConcurrentLinkedQueue<Point> trail;
不管怎么填,只要知道有大小限制即可:
trail.add(position);
if(trail.size() > TRAIL_MAX_COUNT) {
trail.remove();
}
绘图发生在 DrawTrail
方法中:
private void DrawTrail(Canvas canvas) {
trailPath.reset();
boolean isFirst = true;
for(Point p : trail) {
if(isFirst) {
trailPath.moveTo(p.x, p.y);
isFirst = false;
} else {
trailPath.lineTo(p.x, p.y);
}
}
canvas.drawPath(trailPath, trailPaint);
}
顺便说一下,trailPaint
真的很胖:)
trailPaint = new Paint();
trailPaint.setStyle(Paint.Style.STROKE);
trailPaint.setColor(color);
trailPaint.setStrokeWidth(radius * 2);
trailPaint.setAlpha(150);
我知道你想在球的路径上看到一个渐变,你可以使用这样的东西
int x1 = 0, y1 = 0, x2 = 0, y2 = 40;
Shader shader = new LinearGradient(0, 0, 0, 40, Color.WHITE, Color.BLACK, TileMode.CLAMP);
trailPaint = new Paint();
trailPaint.setShader(shader);
这就是您应该将 trailPaint 更改为的内容,看看它是否有效。
由here提供。
我找到了解决方案。不过还是觉得不是最好的
首先,我的 class 字段用于该任务。
static final int TRAIL_MAX_COUNT = 50; //maximum trail array size
static final int TRAIL_DRAW_POINT = 30; //number of points to split the trail for draw
private ConcurrentLinkedQueue<Point> trail;
private Paint[] trailPaints;
private float[][] trailPoss, trailTans;
private Path trailPath;
除了 trailPath
对象之外,我还使用 PathMeasure
对象将路径拆分为多个相等的部分。
填充轨迹数组对象后添加轨迹计算函数的调用
lastTrailAdd = now;
trail.add(pos.Copy());
if (trail.size() > TRAIL_MAX_COUNT) {
trail.remove();
}
FillTrail();
然后是我的FillTrail
函数。
private void FillTrail() {
trailPath.reset();
boolean isFirst = true;
for(Point p : trail) {
if(isFirst) {
trailPath.moveTo(p.x, p.y);
trailPoss[0][0] = p.x;
trailPoss[0][1] = p.y;
isFirst = false;
} else {
trailPath.lineTo(p.x, p.y);
}
}
PathMeasure path = new PathMeasure(trailPath, false);
float step = path.getLength() / TRAIL_DRAW_POINT;
for(int i=0; i<TRAIL_DRAW_POINT; i++) {
path.getPosTan(step * i, trailPoss[i], trailTans[i]);
}
}
画线分离了。下一个代码是绘图功能。
private void DrawTrail(Canvas canvas) {
if(trail.size() > 1) {
float prevWidthHalfX = 0f, prevWidthHalfY = 0f, prevX = 0f, prevY = 0f;
Path trailStepRect = new Path();
boolean isFirst = true;
for (int i = 0; i < TRAIL_DRAW_POINT; i++) {
float currWidthHalf = (float) (radius) * i / TRAIL_DRAW_POINT / 2f,
currWidthHalfX = currWidthHalf * trailTans[i][1],
currWidthHalfY = currWidthHalf * trailTans[i][0],
currX = trailPoss[i][0], currY = trailPoss[i][1];
if (!isFirst) {
trailStepRect.reset();
trailStepRect.moveTo(prevX - prevWidthHalfX, prevY + prevWidthHalfY);
trailStepRect.lineTo(prevX + prevWidthHalfX, prevY - prevWidthHalfY);
trailStepRect.lineTo(currX + currWidthHalfX, currY - currWidthHalfY);
trailStepRect.lineTo(currX - currWidthHalfX, currY + currWidthHalfY);
canvas.drawPath(trailStepRect, trailPaints[i]);
} else {
isFirst = false;
}
prevX = currX;
prevY = currY;
prevWidthHalfX = currWidthHalfX;
prevWidthHalfY = currWidthHalfY;
}
}
}
这个的要点是用不同的油漆来绘制轨迹。更接近球 - 更宽的轨迹。我想我会优化它,但它已经准备好了。
如果您想观看它的外观,只需安装 my app from google play。