我正试图在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解决方案对我不起作用,因为我希望背景在地图上可见)
谢谢!
答案 0 :(得分:8)
Android支持自API级别11以来的硬件加速。问题是在打开硬件加速时并非所有绘图操作都受支持。而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);
}