1

私は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ソリューションは機能しません)

ありがとう!

4

1 に答える 1

8

AndroidはAPIレベル11以降、ハードウェアアクセラレーションをサポートしています。問題は、ハードウェアアクセラレーションがオンになっている場合、すべての描画操作がサポートされるわけではないことです。そしてCanvas.clipPathそれらの1つです。サポートされていない操作の完全なリストはここにあります

clipPathハードウェアアクセラレーションを使用せずに、または単に無効にすることなく、必要なものを実装してみることができます。

アプリケーションレベルでハードウェアアクセラレーションを無効にするには、targetSdkVersion11以上であり、 :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);
}
于 2013-01-12T15:50:35.143 に答える