【问题标题】:Clipping/Masking a MapView on Android在 Android 上剪切/屏蔽 MapView
【发布时间】:2012-12-27 00:25:59
【问题描述】:

我试图在 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 解决方案对我不起作用,因为我希望背景在地图周围可见)

谢谢!

【问题讨论】:

    标签: android canvas android-mapview masking clipping


    【解决方案1】:

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

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

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

    <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);
    }
    

    【讨论】:

    • 我正在使用 API Level 8 (2.2) 是否已经有硬件加速之类的东西?我找不到方法setLayerType(...) 并将android:hardwareAcceleration 标签放入清单会导致错误。我该怎么办?
    • 您必须将 targetSdkVersion 更改为更高的值(至少 11)
    • 但我希望我的应用程序可用于 API-8 以来的手机。还有其他解决方案吗?我正在使用片段和东西的支持框架-那里有什么可以帮助我的吗? :(
    • 您可以将minSdkVersion 设置为8,将targetSdkVersion 设置为11。在这种情况下,该应用将在Android 2.2 的设备上可用,您将能够使用新的API 功能
    • 很抱歉再次打扰您,但我实际上已将targetSdkVersion 设置为17,尽管无法访问hardwareAcceleration 标签或方法:(
    猜你喜欢
    • 2018-09-17
    • 2017-01-01
    • 2015-09-12
    • 2011-02-07
    • 2015-05-06
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多