你可以通过两种方式做你想要的:
1)如你所提:“继承MapView类并覆盖onDraw()事件”.但是MapView扩展了ViewGroup的FrameLayout,所以你应该重写dispatchDraw()而不是onDraw().
这种方法需要自定义视图,它扩展了MapViewand实现:
>绘制MapView;
>自定义线条样式(“钻石而不是简单线”);
> MapView的Lat / Lon坐标的绑定路径.
用于绘制MapView您应该覆盖dispatchDraw(),例如:
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
canvas.save();
drawDiamondsPath(canvas);
canvas.restore();
}
自定义线条样式您可以使用Paint类的setPathEffect()方法.为此您应该创建“钻石印章”(以像素为单位)的路径,这将重复每个“进阶”(以像素为单位):
mPathDiamondStamp = new Path();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.moveTo(-DIAMOND_WIDTH / 2 + DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, -DIAMOND_HEIGHT / 2 + DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.lineTo(DIAMOND_WIDTH / 2 - DIAMOND_BORDER_WIDTH, 0);
mPathDiamondStamp.lineTo(0, DIAMOND_HEIGHT / 2 - DIAMOND_BORDER_WIDTH / 2);
mPathDiamondStamp.close();
mPathDiamondStamp.setFillType(Path.FillType.EVEN_ODD);
mDiamondPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mDiamondPaint.setColor(Color.BLUE);
mDiamondPaint.setStrokeWidth(2);
mDiamondPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mDiamondPaint.setStyle(Paint.Style.STROKE);
mDiamondPaint.setPathEffect(new PathDashPathEffect(mPathDiamondStamp, DIAMOND_ADVANCE, DIAMOND_PHASE, PathDashPathEffect.Style.ROTATE));
(在这种情况下,外边界有2个路径 – 第一个(顺时针),第二个(逆时针)为“菱形”透明“孔”的内边界).
屏幕上的绑定路径到MapView的Lat / Lon坐标您应该具有MapView的MapboxMap对象,因为该getMapAsync()和onMapReady()应该被覆盖:
@Override
public void getMapAsync(OnMapReadyCa