示例#1
0
  private void drawRuler(Canvas canvas) {
    // update cache
    if (view.isZooming()) {
      cacheRulerText = null;
    } else if (view.getFloatZoom() != cacheRulerZoom
        || Math.abs(view.getXTile() - cacheRulerTileX) + Math.abs(view.getYTile() - cacheRulerTileY)
            > 1) {
      cacheRulerZoom = view.getFloatZoom();
      cacheRulerTileX = view.getXTile();
      cacheRulerTileY = view.getYTile();
      double latitude = view.getLatitude();
      double leftLon = view.calcLongitude(-view.getWidth() / 2);
      double rightLon = view.calcLongitude(+view.getWidth() / 2);
      double dist = MapUtils.getDistance(latitude, leftLon, latitude, rightLon);
      double pixDensity = view.getWidth() / dist;

      double roundedDist =
          OsmAndFormatter.calculateRoundedDist(dist * screenRulerPercent, view.getContext());

      int cacheRulerDistPix = (int) (pixDensity * roundedDist);
      cacheRulerText =
          ShadowText.create(
              OsmAndFormatter.getFormattedDistance((float) roundedDist, view.getContext()));
      cacheRulerTextLen = zoomTextPaint.measureText(cacheRulerText.getText());

      Rect bounds = rulerDrawable.getBounds();
      bounds.right = (int) (view.getWidth() - 7 * scaleCoefficient);
      bounds.bottom =
          (int)
              (view.getHeight()
                  - view.getResources().getDrawable(R.drawable.map_zoom_in).getMinimumHeight());
      bounds.top = bounds.bottom - rulerDrawable.getMinimumHeight();
      bounds.left = bounds.right - cacheRulerDistPix;
      rulerDrawable.setBounds(bounds);
    }
    if (cacheRulerText != null) {
      rulerDrawable.draw(canvas);
      Rect bounds = rulerDrawable.getBounds();
      cacheRulerText.draw(
          canvas,
          bounds.left + (bounds.width() - cacheRulerTextLen) / 2,
          bounds.bottom - 8 * scaleCoefficient,
          rulerTextPaint,
          shadowColor);
    }
  }