放大Android开发 - 谷歌地图变得更慢

时间:2010-02-15 09:05:39

标签: android google-maps zoom

我开发了一个GPS应用程序,我在其中记录用户路线并在地图上显示。但是在查看我的路线时在地图上平移是非常缓慢的,地图至少需要4或5秒才能响应手指滑动。

我已经重写onDraw()方法并绘制线条以便在我们放大地图时显示路线,通过调用onDraw()(重叠)方法再次绘制lat-long,其中包含具有lat的geopoints -lon值,因此显示地图变得非常慢。有没有更好的方法来实现这一点,以便在应用程序“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);
            }   
        }






    }

}

1 个答案:

答案 0 :(得分:0)

您可以将积分保存到服务器上的KML文件吗? 尝试创建具有相同点的预制KML文件,并使用以下方法将其添加到地图中:

Intent mapIntent = new Intent(Intent.ACTION_VIEW, uri);
Uri uri1 = Uri.parse("geo:0,0?q=http://code.google.com/apis/kml/documentation/KML_Samples.kml");
mapIntent.setData(uri1);
startActivity(Intent.createChooser(mapIntent, "Sample Map ")); 

如果速度要快得多,那么你应该看看这种方法而不是编写自己的绘制方法。 KML是XML的一种形式,因此您可以以相同的方式创建它。记得将样式(颜色等)添加到KML文件中。