Я пытаюсь реализовать собственный оверлей карт для osmdroid (но я предполагаю, что он довольно похож на наложения карт Google).
То, что я пытаюсь сделать, это нарисовать плоскость, повернуть ее в соответствии с подшипником и нарисовать вектор скорости (линия впереди плоскости в направлении полета, которая показывает, где она скоро будет).
Идея состоит в том, что я рисую плоскость (и все) на холсте "лицом к северу", а затем поворачиваю его в соответствии с направлением полета и "сливаю" его с наложенным холстом (я попытался рисовать прямо на холст наложения, но при повороте, он также вращал карту).
Я создал подкласс Overlay и overiden метод onDraw следующим образом:
@Override
protected void draw(Canvas c, MapView mapView, boolean shadow) {
if (location != null) {
Point locPoint = new Point();
GeoPoint locGeoPoint = new GeoPoint(location);
final Projection pj = mapView.getProjection();
pj.toMapPixels(locGeoPoint, locPoint);
this.drawPlane(c, locPoint, location.getBearing());
}
}
private void drawPlane(Canvas cs, Point ctr, float bearing) {
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
Bitmap planeBM = Bitmap.createBitmap(cs.getWidth(), cs.getHeight(), Bitmap.Config.ARGB_8888);
planeBM.setDensity(cs.getDensity());
Canvas c = new Canvas(planeBM);
Rect r = new Rect();
//Point center = new Point(cs.getWidth() / 2, cs.getHeight() /2);
Point center = new Point(0, 0);
// Draw fuselage
r.left = center.x - PLANE_WIDTH / 2;
r.right = r.left + PLANE_WIDTH;
r.top = center.y - PLANE_SIZE / 3;
r.bottom = r.top + PLANE_SIZE;
c.drawRect(r, paint);
// Draw wing (REMOVED)
// Draw stabilizer (REMOVED)
// TODO Draw Speed vector
// "Merging" canvas
Matrix merge = new Matrix(cs.getMatrix());
//merge.setTranslate(0, 0);
//merge.setRotate(bearing, center.x, center.y);
cs.drawBitmap(planeBM, merge, paint);
cs.save();
}
В основном мой самолет никогда не показывает.
Я предполагаю, что это связано с матрицей в начальном холсте с большими значениями (я предполагаю, что это своего рода географические координаты).
Все это кажется последовательным, хотя (расположение плоскости имеет большие значения, также соответствующие матрице).
Я пробовал несколько вещей:
Я знаю, что мое изображение содержит плоскость (по крайней мере, если я рисую от 0,0 или новый холст-центр, когда я сохранил его на SD, чтобы проверить...
В случае, если это кому-то полезно, я наконец нашел решение.
В основном я пытался сделать слишком много в одно и то же время. Использование setPostRotate вместо setRotate в матрице слияния решило проблему (это и goig bac на чертежной доске для правильных параметров перевода).
Использование ниже в качестве матрицы слияния работало:
// "Merging" canvas
Matrix merge = new Matrix();
merge.setTranslate(loc.x - pCenter.x, loc.y - pCenter.y);
merge.postRotate(bearing, loc.x, loc.y);