Partial implementation 277. Poi labelling

This commit is contained in:
Victor Shcherb 2011-09-18 22:00:40 +02:00
parent 197fe1ff1f
commit c35f20d7c4
2 changed files with 66 additions and 1 deletions

View file

@ -542,7 +542,6 @@ public class OsmandRenderer {
paintText.setColor(Color.WHITE); paintText.setColor(Color.WHITE);
paintText.setStrokeWidth(2 + textShadow); paintText.setStrokeWidth(2 + textShadow);
cv.drawText(text, centerX, centerY, paint); cv.drawText(text, centerX, centerY, paint);
cv.drawText(text, centerX, centerY, paint);
// reset // reset
paintText.setStrokeWidth(2); paintText.setStrokeWidth(2);
paintText.setStyle(Style.FILL); paintText.setStyle(Style.FILL);

View file

@ -25,6 +25,7 @@ import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style; import android.graphics.Paint.Style;
import android.net.Uri; import android.net.Uri;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
@ -34,11 +35,13 @@ import android.widget.Toast;
public class POIMapLayer implements OsmandMapLayer, ContextMenuLayer.IContextMenuProvider { public class POIMapLayer implements OsmandMapLayer, ContextMenuLayer.IContextMenuProvider {
private static final int startZoom = 10; private static final int startZoom = 10;
public static final int LIMIT_POI = 200; public static final int LIMIT_POI = 200;
public static final int TEXT_WRAP = 30;
public static final org.apache.commons.logging.Log log = LogUtil.getLog(POIMapLayer.class); public static final org.apache.commons.logging.Log log = LogUtil.getLog(POIMapLayer.class);
private Paint pointAltUI; private Paint pointAltUI;
private Paint paintIcon; private Paint paintIcon;
private Paint paintTextIcon;
private Paint point; private Paint point;
private OsmandMapTileView view; private OsmandMapTileView view;
private List<Amenity> objects = new ArrayList<Amenity>(); private List<Amenity> objects = new ArrayList<Amenity>();
@ -121,6 +124,10 @@ public class POIMapLayer implements OsmandMapLayer, ContextMenuLayer.IContextMen
paintIcon = new Paint(); paintIcon = new Paint();
paintTextIcon = new Paint();
paintTextIcon.setTextSize(12 * dm.density);
paintTextIcon.setTextAlign(Align.CENTER);
point = new Paint(); point = new Paint();
point.setColor(Color.GRAY); point.setColor(Color.GRAY);
point.setAntiAlias(true); point.setAntiAlias(true);
@ -178,6 +185,17 @@ public class POIMapLayer implements OsmandMapLayer, ContextMenuLayer.IContextMen
if(bmp != null){ if(bmp != null){
canvas.drawBitmap(bmp, x - bmp.getWidth() / 2, y - bmp.getHeight() / 2, paintIcon); canvas.drawBitmap(bmp, x - bmp.getWidth() / 2, y - bmp.getHeight() / 2, paintIcon);
} }
String name = o.getName(view.getSettings().USE_ENGLISH_NAMES.get());
if(name != null && name.length() > 0){
// TODO cache list
// 1. Draw over in 2 phases over all circles
// 2. Draw without rotation and icons (!)
// 3. Omit highdensity icons
// drawWrappedText(canvas, name, paintTextIcon.getTextSize(),
// x + bmp.getWidth() / 2, y + bmp.getHeight() / 2 +
// paintTextIcon.getTextSize() / 2);
}
} }
} }
@ -185,6 +203,54 @@ public class POIMapLayer implements OsmandMapLayer, ContextMenuLayer.IContextMen
} }
} }
private void drawWrappedText(Canvas cv, String text, float textSize, float x, float y) {
if(text.length() > TEXT_WRAP){
int start = 0;
int end = text.length();
int lastSpace = -1;
int line = 0;
int pos = 0;
int limit = 0;
while(pos < end){
lastSpace = -1;
limit += TEXT_WRAP;
while(pos < limit && pos < end){
if(!Character.isLetterOrDigit(text.charAt(pos))){
lastSpace = pos;
}
pos++;
}
if(lastSpace == -1){
drawShadowText(cv, text.substring(start, pos), x, y + line * (textSize + 2));
start = pos;
} else {
String subtext = text.substring(start, lastSpace);
drawShadowText(cv, subtext, x, y + line * (textSize + 2));
start = lastSpace + 1;
limit += (start - pos) - 1;
}
line++;
}
} else {
drawShadowText(cv, text, x, y);
}
}
private void drawShadowText(Canvas cv, String text, float centerX, float centerY) {
int c = paintTextIcon.getColor();
paintTextIcon.setStyle(Style.STROKE);
paintTextIcon.setColor(Color.WHITE);
paintTextIcon.setStrokeWidth(2);
cv.drawText(text, centerX, centerY, paintTextIcon);
// reset
paintTextIcon.setStrokeWidth(2);
paintTextIcon.setStyle(Style.FILL);
paintTextIcon.setColor(c);
cv.drawText(text, centerX, centerY, paintTextIcon);
}
@Override @Override
public void destroyLayer() { public void destroyLayer() {
cachedIcons.clear(); cachedIcons.clear();