我必须在SurfaceView上绘制一些物体移动的痕迹。对象的轨迹实现为点的LinkedList(点是SurfaceView上的一对浮点坐标)。 LinkedList受到类似行为的推动
public class Trail extends LinkedList<Points> {
private static int numbOfPoints;
@Override
public boolean add(Point point) {
super.add(point);
while( this.size() > Trail.numbOfPoints ) {
super.remove();
}
return true;
}
}
其中numbOfPoints是最大跟踪点数。如果添加了新点,则从路径中删除最旧点以维持路径大小的固定。但是当我绘制点时,我会有一个float []而不是一个LinkedList of Points来使用canvas.drawPoints(float [])。所以我想出了一个从LinkedList到float []的手动转换,效率很低并且会导致一些麻烦......
那么,有一种方法可以避免使用LinkedList并将坐标直接存储到具有上述行为的float []中吗?
答案 0 :(得分:1)
我认为实现这一目标的最佳方式是通过ring buffer。我不太了解你是如何使用float[]
代替float[][]
在画布上绘制某些东西的,但是你应该能够使用你喜欢的任何类型来解决这个问题:
class Trail {
private final int maxLength;
private float[] points;
private int start = 0;
private int length = 0;
private float[] buffer;
public Trail(int maxLength) {
this.maxLength = maxLength;
this.points = new float[maxLength];
this.buffer = new float[0];
}
public void add(float point) {
points[(start + length) % points.length] = point;
if (length < maxLength) {
length++;
} else {
start = (start + 1) % points.length;
}
}
public float[] getTail() {
if (buffer.length != length) { // Reusing the array if possible.
buffer = new float[length];
}
int itemsFromStartToArrayEnd = Math.min(length, points.length - start);
System.arraycopy(points, start, buffer, 0, itemsFromStartToArrayEnd);
if (start + length > maxLength) {
System.arraycopy(points, 0, buffer, itemsFromStartToArrayEnd, length - itemsFromStartToArrayEnd);
}
return buffer;
}
}