2014-11-22 41 views
0

我想繪製地圖上位置的圖釘。該地圖是可縮放和平移的,這要歸功於我正在使用的圖書館中的該課程:優化視圖的抽取方法

https://github.com/davemorrissey/subsampling-scale-image-view

我擴展subsamplingimageview類來繪製圖像。地圖 的分辨率是2494乘2048像素,每個像素是一個座標。當活動可見時,只有整個地圖的一部分可見。

問題: 我需要在地圖上繪製250個針腳,我試過這樣,但縮放和平移地圖的表現不佳。

我如何繪製地圖上的別針而不會丟失性能? 我試着對圖像本身的位圖繪製引腳,但我不能忍受與銷圖像地圖視圖,除非它在資產文件夾,但該文件夾是隻讀的...

protected override void OnDraw(Canvas canvas) 
    { 
     base.OnDraw(canvas); 

     // Don't draw pin before image is ready so it doesn't move around during setup. 
     if (!IsImageReady) 
     { 
      return; 
     } 

     Paint paint = new Paint(); 
     paint.AntiAlias = true; 

     foreach (Location location in locations) 
     { 

     if (location != null && pin != null) 
     { 
      PointF vPin = SourceToViewCoord(new PointF((float)location.X , (float) location.Y )); 
      float vX = vPin.X - (pin.Width/2); 
      float vY = vPin.Y - pin.Height; 
      canvas.DrawBitmap(pin, vX, vY, paint); 
      if (pinPushed) 
      { 
       if (location != null && info != null) 
       { 
        PointF vInfo = SourceToViewCoord (new PointF((float)location.X , (float) location.Y )); 
        float vInfoX = vInfo.X - (info.Width/2) + (int)ConvertDpToPix(8);//8 pixels cause image is not in the middle 
        float vInfoY = vInfo.Y - info.Height; 
        //canvas.DrawBitmap (info, vX, vY, paint); 
        //float w2 = info.Width; 
        //float h2 = info.Height; 
        canvas.DrawBitmap (textBalloonBitmap, vInfoX, vInfoY, paint); 

       } 
      } 
      } 
     } 

回答

0

我不知道在你的案例中調用了多少onDraw,但通常大於1.因此,最好不要在onDraw中使用「new」。但它只是一點優化。也許你可以檢查當前幀中的引腳是否可見(可能不是所有的250引腳在同一時間都可見)。

只是例子我不試試。

private Paint paint = new Paint(); 
private PointF vPin; 
private PointF vPinSTVC = PointF(); 
private PointF vInfo; 
private PointF vInfoSTVC = PointF(); 

protected void OnDraw(Canvas canvas) 
    { 
     base.OnDraw(canvas); 

     // Don't draw pin before image is ready so it doesn't move around during setup. 
     if (!IsImageReady) 
     { 
      return; 
     } 

     paint.reset(); 
     paint.AntiAlias = true; 

     foreach (Location location in locations) 
     { 

     if (location != null && pin != null) 
     { 
      vPin = SourceToViewCoord(new PointF(vPinSTVC.set((float)location.X, (float) location.Y)); 
      float vX = vPin.X - (pin.Width/2); 
      float vY = vPin.Y - pin.Height; 
      canvas.DrawBitmap(pin, vX, vY, paint); 
      if (pinPushed) 
      { 
       if (location != null && info != null) 
       { 
        vInfo = SourceToViewCoord (vInfoSTVC.set((float)location.X , (float) location.Y)); 
        float vInfoX = vInfo.X - (info.Width/2) + (int)ConvertDpToPix(8);//8 pixels cause image is not in the middle 
        float vInfoY = vInfo.Y - info.Height; 
        //canvas.DrawBitmap (info, vX, vY, paint); 
        //float w2 = info.Width; 
        //float h2 = info.Height; 
        canvas.DrawBitmap (textBalloonBitmap, vInfoX, vInfoY, paint); 

       } 
      } 
      } 
     } 
從文檔(資料庫)

下一個選項是可能使用imageView.setImageUri( 「」);也許你可以啓動應用程序繪製位圖並將其保存在SD卡上並在setImmageUri中使用它。