yandexmobile / yandexmapkit-android

Yandex Map Kit for Android
160 stars 65 forks source link

Анимация overlayItem #242

Open NoNews opened 7 years ago

NoNews commented 7 years ago

Здравствуйте. Возможно ли применить к overlayItem вот такую маску, как в текущем местоположении? +, с помощью анимации изменять её размеры?

IvanKorol87 commented 7 years ago

Да это возможно сделать Вот пример кода CirclePolygon circle = new CirclePolygon(yMap.getMapController(), place.getLat(), place.getLng(), place.getDistance()); yMap.getMapController().getOverlayManager().addOverlay(circle);

public class CirclePolygon extends Overlay {

OverlayCircleItem overlayCircleItem;
Context mContext;
MapController mMapController;
CircleRender circleRender;

public CirclePolygon(MapController mapController, double lat, double lng, int radius) {
    super(mapController);
    mMapController = mapController;
    mContext = mapController.getContext();
    circleRender = new CircleRender();
    setIRender(circleRender);

    overlayCircleItem = new OverlayCircleItem(new GeoPoint(0, 0), mContext.getResources().getDrawable(R.drawable.icon));
    for (float f = 0; f < 360; f++){
        org.osmdroid.util.GeoPoint d = new org.osmdroid.util.GeoPoint(lat, lng).destinationPoint(radius, f);
        overlayCircleItem.geoPoint.add(new GeoPoint(d.getLatitude(), d.getLongitude()));
    }
    addOverlayItem(overlayCircleItem);

}

@Override
public List<OverlayItem> prepareDraw() {
    // TODO Auto-generated method stub
    ArrayList<OverlayItem> draw = new ArrayList<OverlayItem>();
    overlayCircleItem.screenPoint.clear();
    for (GeoPoint point : overlayCircleItem.geoPoint) {
        overlayCircleItem.screenPoint.add(mMapController.getScreenPoint(point));
    }
    draw.add(overlayCircleItem);

    return draw;
}

}

public class CircleRender implements IRender {

@Override
public void draw(Canvas canvas, OverlayItem item_) {
    // TODO Auto-generated method stub

    Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setColor(ColorScheme.NowTheme.LightColor); //ТУТ НУЖНО ЗАДАТЬ ЦВЕТ ВОТ ТАК 0x55607d8b
    mPaint.setStrokeWidth(100f);

    OverlayCircleItem item  = (OverlayCircleItem)item_;
    Path p = new Path();
    if (item.screenPoint != null && item.screenPoint.size() > 0)
    {
        ScreenPoint screenPoint = item.screenPoint.get(0);
        p.moveTo(screenPoint.getX(), screenPoint.getY());

        for (int i = 1; i<item.screenPoint.size(); i++ ){
            screenPoint = item.screenPoint.get(i);
            p.lineTo(screenPoint.getX(), screenPoint.getY());
        }
        canvas.drawPath(p, mPaint);
    }
}

}

saint13 commented 7 years ago

День добрый все это можно реализовать через Shape shape = new OvalShape(); ShapeDrawable drawable = new ShapeDrawable(shape);

И данный drawable передать в overlayItem.

А в методе getRectBounds() у overlayItem изменять размеры.