Я разработал приложение GPS, в котором я записываю маршруты пользователя и показываю его на карте. Но панорамирование на карте при просмотре моего маршрута мучительно медленное, карте требуется не менее 4–5 секунд, чтобы карта ответила пальцами.
Я переопределил метод onDraw () и рисовал линии для отображения маршрутов при каждом увеличении масштаба карты. Лат-лонг снова рисуется путем вызова метода onDraw () (Overridden), который имеет геоинты с лат -лон значения, и, следовательно, отображение карты будет очень медленным. Есть ли лучший способ сделать это так, чтобы панорамирование стало быстрее, чем в приложении «MyTracks»?
Ниже приведен код для рисования маршрутов на карте. Пожалуйста, посмотрите на это и покажите мне, как я могу сделать его более эффективным, чтобы панорамирование и масштабирование работали хорошо.
class PathOverlay extends Overlay{
public PathOverlay() {
// TODO Auto-generated constructor stub
geopoints=new ArrayList<GeoPoint>();
c.moveToFirst();
for (int i = 0; i <c.getCount() ; i++){
if(c.getDouble(c.getColumnIndex("latitude")) != 0.0 ||
c.getDouble(c.getColumnIndex("longitude"))!=0.0) {
geopoints.add(getPoint(c.getDouble(c.getColumnIndex("latitude"))
, c.getDouble(c.getColumnIndex("longitude"))));
gps_status.add(Boolean.parseBoolean(c.getString(c.getColumnIndex("gps") )));
avgeSpeed_points.add(c.getFloat(9));
}
c.moveToNext();
}
}
private GeoPoint getPoint(double lat, double lon) {
return(new GeoPoint((int)(lat*1000000.0),(int)(lon*1000000.0)));
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// super.draw(canvas, mapView, shadow);
mapView.getDrawingCache();
Paint paint_Line=new Paint();
//paint_Line.setColor(Color.RED);
paint_Line.setARGB(255, 255, 0, 0);
paint_Line.setStrokeWidth(3);
paint_Line.setDither(true);
paint_Line.setStyle(Style.FILL);
paint_Line.setAntiAlias(true);
paint_Line.setStrokeJoin(Paint.Join.ROUND);
paint_Line.setStrokeCap(Paint.Cap.ROUND);
mapView.postInvalidateDelayed(6000);
for(int i=0;i<geopoints.size()-1;i++) {
Point p1=new Point();
Point p2=new Point();
if((geopoints.get(i).getLatitudeE6()!=geopoints.get(i+1).getLatitudeE6())
&& (geopoints.get(i).getLongitudeE6()!=geopoints.get(i+1).getLongitudeE6())
&& gps_status.get(i+1)){
paint_Line.setColor(Color.BLUE);
mapView.getProjection().toPixels(geopoints.get(i), p1);
mapView.getProjection().toPixels(geopoints.get(i+1),p2);
canvas.drawLine(p1.x,p1.y,p2.x,p2.y,paint_Line);
}
mapView.getProjection().toPixels(geopoints.get(i),p1);
if(i==0){
canvas.drawBitmap(start, p1.x-2, p1.y-start.getHeight()+2, null);
}
if (i+1==geopoints.size()-1) {
canvas.drawBitmap(finish, p1.x-2, p1.y-finish.getHeight()+2, null);
}
}
}
}