我试图像这样在Android上将MapView显示为圆形:

protected void onDraw(Canvas canvas) {
    Path path = new Path();
    path.addCircle(400,200,100,Direction.CW);
    canvas.clipPath(path);
    super.onDraw(canvas);
}


不幸的是,MapView(v2:com.google.android.gms.maps.MapView)组件似乎忽略了它,而是仅以该圆的边界/矩形来绘制地图:(

我已经在网上搜索了一段时间,但没有找到一个好的解决方案。

这有可能吗? (Blundell解决方案不适用于我,因为我希望背景在地图上可见)

谢谢!

最佳答案

从API级别11开始,Android支持硬件加速。问题在于,打开硬件加速后,并非所有绘图操作都受支持。 Canvas.clipPath是其中之一。可以找到不支持的操作的完整列表here

您可以尝试在不使用clipPath的情况下实现所需的功能,或者仅禁用硬件加速。

要在应用程序级别禁用硬件加速,请确保您具有targetSdkVersion 11或更高版本,并在hardwareAccelerated中使用AndroidManifest标记:

<application android:hardwareAccelerated="false" ...>


您可以使用以下方法仅对特定视图禁用硬件加速。

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void enableHardwareAcceleration(View view, boolean enabled) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (enabled) {
            view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        } else {
            view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }
}


请注意,您必须使用TargetApi批注并检查设备android版本是否为Honeycomb或更高版本,否则Eclipse可能会产生错误。

如果您问题中的代码不起作用,请尝试用以下代码替换它:

@Override
protected void dispatchDraw(Canvas canvas) {
    Path path = new Path();
    int count = canvas.save();

    path.addCircle(400,200,100,Direction.CW);

    canvas.clipPath(path);
    super.dispatchDraw(canvas);
    canvas.restoreToCount(count);
}

10-06 09:15
查看更多