gpt4 book ai didi

android - 如何让路线绘制更高效?

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:20 26 4
gpt4 key购买 nike

这是我用来绘制路线的代码。当我有 1000 个点时,路线会严重减慢用户界面。也许有人可以提供代码 fragment 或链接来解释如何更有效地绘制路线?我知道解决这个问题的一种方法是缓存位图路径,但不知道该怎么做。

public class PathOverlay extends Overlay{

private GeoPoint startPoint;
private GeoPoint finishPoint;
private ArrayList<GeoPoint> pathPoints;
private Paint paint;
private Path path;
private Point pathStartPoint;
private Point pathEndPoint;

private float dx;
private float dy;


public PathOverlay(GeoPoint startPoint, GeoPoint finishPoint, ArrayList<GeoPoint> pathPoints, int color){
this.startPoint = startPoint;
this.finishPoint = finishPoint;
this.pathPoints = pathPoints;
this.paint = new Paint();
this.paint.setAntiAlias(true);
this.paint.setDither(true);
this.paint.setColor(color);
this.paint.setAlpha(150);
this.paint.setStrokeWidth(4);
this.paint.setStyle(Paint.Style.STROKE);
}

@Override
public void draw(Canvas overlayCanvas, MapView mapView, boolean shadow) {
if(path == null) {
path = getPath(mapView);
} else {
path = transformPath(mapView);
}
overlayCanvas.drawPath(path, paint);
super.draw(overlayCanvas, mapView, shadow);
}

private Path getPath(MapView mapView) {
Projection projection = mapView.getProjection();
if(path == null) {
path = new Path();
path.setFillType(FillType.WINDING);
} else {
path.rewind();
}
Point point = new Point();
pathStartPoint = new Point();
pathEndPoint = new Point();

projection.toPixels(startPoint, point);
projection.toPixels(startPoint, pathStartPoint);
path.moveTo(point.x, point.y);
path.addCircle(point.x, point.y, (float) 2.0, Direction.CCW);
if (pathPoints != null) {
for(int i=0;i<pathPoints.size();i++) {
projection.toPixels(pathPoints.get(i), point);
path.lineTo(point.x, point.y);
}
}
projection.toPixels(finishPoint, point);
projection.toPixels(finishPoint, pathEndPoint);
path.lineTo(point.x-5, point.y);
path.addCircle(point.x-5, point.y, (float) 2.0, Direction.CCW);


return path;
}

private Path transformPath(MapView mapView) {
Projection projection = mapView.getProjection();

Point sPoint = new Point();
Point ePoint = new Point();
projection.toPixels(startPoint, sPoint);
projection.toPixels(finishPoint, ePoint);

float sx = ((float)ePoint.x - (float)sPoint.x)/((float)pathEndPoint.x - (float)pathStartPoint.x);
float sy = ((float)ePoint.y - (float)sPoint.y)/((float)pathEndPoint.y - (float)pathStartPoint.y);

if(sx != 1.0 && sy != 1.0) {
Log.i("PathOverlay", "resized");
return getPath(mapView);
} else {
Log.i("PathOverlay", "moved");
Matrix matrix = new Matrix();

dx = (float)sPoint.x - (float)pathStartPoint.x;
dy = (float)sPoint.y - (float)pathStartPoint.y;

matrix.postTranslate(dx, dy);
pathStartPoint = sPoint;
pathEndPoint = ePoint;
path.transform(matrix);

return path;
}
}

}

最佳答案

您可以绘制通向透明 Bitmap 对象的路径(无论您认为合适的大小 - 它越大,路径的细节越好,但内存消耗越高)。

确保使用 Bitmap.config.ARGB_8888 创建它以实现透明度。

完成此操作后,您将使用两个矩形在 Overlay 上显示路径:

  • 确定路径的哪一部分可见的源矩形
  • 一个目标矩形,用于确定您要在 Overlay Canvas 上的哪个位置显示这条路径。

您将使用 Canvas.drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

应该不会太难,您已经在 transformPath 方法中完成了大部分重要的计算。

添加:

实际上,您可以结合使用绘制到位图的路径和重绘实际路径点。当用户在 map 上移动或放大/缩小时使用上述技术,然后在用户松开屏幕时重新绘制路径。

关于android - 如何让路线绘制更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com