在Android上剪切/屏蔽MapView

Max*_*Max 1 android canvas clipping masking android-mapview

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

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

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

我一直在网上搜索一段时间,没有找到一个很好的解决方案.

这甚至可能吗?(Blundell解决方案对我不起作用,因为我希望背景在地图上可见)

谢谢!

Vla*_*nov 8

Android支持自API级别11以来的硬件加速.问题是在打开硬件加速时并非所有绘图操作都受支持.而Canvas.clipPath就是其中之一.可以在此处找到不受支持的操作的完整列表

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

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

<application android:hardwareAccelerated="false" ...>
Run Code Online (Sandbox Code Playgroud)

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

@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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须使用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);
}
Run Code Online (Sandbox Code Playgroud)