#android #canvas #android-mapview #geometry
#Android #холст #android-mapview #геометрия
Вопрос:
Я пытаюсь нарисовать пользовательское рисованное наложение на MapView. Я использую пользовательский класс, который расширяет Drawable, чтобы нарисовать круг на холсте. Затем я передаю ему переменную radius и добавляю ее в ItemizedOverlay, который применяется к MapView.
Пока это получается довольно хорошо, но по какой-то причине метод canvas.drawCircle рисует прозрачный круг с тем, что выглядит как эллипс внутри него, и я, хоть убей, не могу понять, что является причиной этого. Я действительно хочу, чтобы круг был прозрачным, но я не хочу, чтобы внутри него был этот эллипс.
Вот пользовательский класс Drawable:
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
public class PileDrawable extends Drawable {
private static final Paint paint = new Paint();
int rad;
public PileDrawable(int radius) {
paint.setARGB(100, 0, 255, 0);
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
rad=radius;
}
@Override
public void draw(Canvas canvas) {
canvas.drawCircle(0, 0, rad, paint);
}
@Override
public int getOpacity() {
return 0;
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
}
Примерно так это и выглядит, не обращайте внимания на отсутствие у меня навыков MS paint…
http://img222.imageshack.us/img222/4356/circleellipse.png
У меня стойкое ощущение, что проблема возникает, когда я применяю границы к рисуемому объекту.
PileDrawable pd = new PileDrawable((int)(mapView.getProjection().metersToEquatorPixels(Radius) * (1/ Math.cos(Math.toRadians(point.getLatitudeE6())))));
pd.setBounds(0,0,pd.getIntrinsicWidth(),pd.getIntrinsicHeight()); //HERE?
Итак, есть идеи?
Ответ №1:
возможно, немного поздно, но вот как я рисую круг на карте в качестве наложения. надеюсь, это поможет людям в будущем
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
Projection proj = mapView.getProjection();
GeoPoint loc = new GeoPoint(geo.getLat(), geo.getLng());
Point point = new Point();
proj.toPixels(loc, point);
float rad = (float) (proj.metersToEquatorPixels(radius) * (1 / Math.cos(Math.toRadians(loc.getLatitudeE6() / 1000000))));
Paint circle = new Paint();
circle.setColor(colour);
circle.setAlpha(30);
circle.setAntiAlias(true);
circle.setStyle(Style.FILL);
canvas.drawCircle(point.x, point.y, rad, circle);
super.draw(canvas, mapView, shadow);
}
и работает как шарм. я не уверен, почему рисуется эллипс, поскольку в коде нет ничего для рисования эллипса, но я предполагаю, что это может быть причиной преобразования целочисленного значения, а не преобразования значения с плавающей точкой, в то время как вы инициализируете PileDrawable