package com.robert.maps.applib.utils; import org.andnav.osm.util.GeoPoint; import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import com.robert.maps.applib.R; import com.robert.maps.applib.view.MapView; import com.robert.maps.applib.view.TileView.OpenStreetMapViewProjection; public class ScaleBarDrawable extends Drawable { private Paint mPaint = new Paint(); private Paint mPaint2 = new Paint(); private Paint mPaint3 = new Paint(); private Paint mPaint4 = new Paint(); private MapView mOsmv; private int mZoomLevel = -1; private double mTouchScale = 1; private String mDist = ""; private int mWidth = 100; private int mUnits; private int mWidth2 = 100; private int mIntrinsicHeight; private int mIntrinsicWidth; private int mScaleCorretion; private static final int SCALE[][] = {{25000000,15000000,8000000,4000000,2000000,1000000,500000,250000,100000,50000,25000,15000,8000,4000,2000,1000,500,250,100,50,25,10,5} ,{15000,8000,4000,2000,1000,500,250,100,50,25,15,8,21120,10560,5280,3000,1500,500,250,100,50,25,10}}; public ScaleBarDrawable(Context ctx, MapView osmv, int units) { mOsmv = osmv; mUnits = units; mScaleCorretion = 0; mPaint.setColor(ctx.getResources().getColor(android.R.color.black)); mPaint2.setColor(ctx.getResources().getColor(android.R.color.white)); mPaint3.setColor(ctx.getResources().getColor(android.R.color.black)); mPaint3.setAntiAlias(true); mPaint3.setTextSize(ctx.getResources().getDimension(R.dimen.scale_descr_text_size)); mPaint4.setColor(ctx.getResources().getColor(android.R.color.white)); mPaint4.setAntiAlias(true); mPaint4.setTextSize(ctx.getResources().getDimension(R.dimen.scale_descr_text_size)); mIntrinsicHeight = (int) (10+ctx.getResources().getDimension(R.dimen.scale_descr_text_size)); mIntrinsicWidth = (int) (10+ctx.getResources().getDimension(R.dimen.scalebar_width)); } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); } @Override public void draw(Canvas canvas) { final int h = 13, h2 = 6, margin = 7; mZoomLevel = mOsmv.getZoomLevel(); mTouchScale = mOsmv.getTouchScale(); final OpenStreetMapViewProjection pj = mOsmv.getTileView().getProjection(); final GeoPoint center = mOsmv.getMapCenter(); int dist = SCALE[mUnits][Math.max(0, Math.min(19, mZoomLevel + 1 + (int)(mTouchScale > 1 ? Math.round(mTouchScale)-1 : -Math.round(1/mTouchScale)+1)) + mScaleCorretion)]; if(mUnits == 0){ if(dist > 999) { mDist = ""+(dist/1000)+" km"; } else mDist = ""+dist+" m"; } else { if(mZoomLevel < 11){ mDist = ""+dist+" ml"; dist = (int) (dist * 1609.344); } else if(dist >= 5280) { mDist = ""+(int)(dist / 5280)+" ml"; dist = (int) (dist * 0.305); } else { mDist = ""+dist+" ft"; dist = (int) (dist * 0.305); } } final GeoPoint c2 = center.calculateEndingGlobalCoordinates(center, 90, dist); final Point p = new Point(); pj.toPixels(c2, p); mWidth = p.x - mOsmv.getWidth() / 2; mWidth2 = (int) mWidth / 2; canvas.drawRect(margin+0, 0, margin+mWidth+2, 4, mPaint2); canvas.drawRect(margin+0, 0, margin+4, h+2, mPaint2); canvas.drawRect(margin+mWidth+2-4, 0, margin+mWidth+2, h+2, mPaint2); canvas.drawRect(margin+mWidth2+2-4, 0, margin+mWidth2+2, h2+2, mPaint2); canvas.drawRect(margin+1, 1, margin+mWidth+1, 3, mPaint); canvas.drawRect(margin+1, 1, margin+3, h+1, mPaint); canvas.drawRect(margin+mWidth+1-2, 1, margin+mWidth+1, h+1, mPaint); canvas.drawRect(margin+mWidth2+1-2, 1, margin+mWidth2+1, h2+1, mPaint); canvas.drawText(mDist, margin+7-1, 2+mPaint3.getTextSize()-1, mPaint4); canvas.drawText(mDist, margin+7+1, 2+mPaint3.getTextSize()+1, mPaint4); canvas.drawText(mDist, margin+7, 2+mPaint3.getTextSize(), mPaint3); } public void correctScale(double sizeFactor, double sizeFactorGoogle) { mScaleCorretion = Math.max(0, ((int) sizeFactor) - 1) + Math.max(0, ((int) sizeFactorGoogle) - 1); if(mScaleCorretion < 0) mScaleCorretion = 0; } @Override public int getIntrinsicWidth() { return mIntrinsicWidth; } @Override public int getIntrinsicHeight() { return mIntrinsicHeight; } @Override public int getOpacity() { return 0; } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter cf) { } }