25

Android 3.0 以降、ハードウェア アクセラレーションがオンになっているデバイスでは、 clipPath()メソッドはサポートされなくなりました (詳細については、この記事を参照してください)。

私はキャンバスで作業しており、丸みを帯びた画像を描く必要があります。どうすればそれを行うことができるかについてのアイデアはありますか?

*ハードウェア アクセラレーションをオフにできません。他の解決策を探しています。

回答済み: Tnx @Malcolm からの回答です。このテクニックを示す良い例を見つけました。これは基本的にマスクです。

4

2 に答える 2

42

clipPathハードウェア アクセラレーションを使用すると、API レベル 18 以降でのみサポートされます。API レベル 11 から 17 では、オフにする必要があります。

あなたが言及した記事には手がかりが含まれています:

アプリケーションがこれらの欠落している機能または制限の影響を受ける場合は、 setLayerType(View.LAYER_TYPE_SOFTWARE, null)を呼び出して、アプリケーションの影響を受ける部分だけのハードウェア アクセラレーションをオフにすることができます。このようにして、他の場所でもハードウェア アクセラレーションを利用できます。アプリケーションのさまざまなレベルでハードウェア アクセラレーションを有効または無効にする方法の詳細については、 「ハードウェア アクセラレーションの制御」を参照してください。

ここでの主なアイデアは、API レベルが 18 未満のデバイスでサポートされていないメソッドを使用する必要があるアプリケーションの一部で、ハードウェア アクセラレーションを無効にすることです。特定のビューに対して行うことができます。完全にオフにする必要はありません。アプリケーション全体。

ハードウェア アクセラレーションをオフにしたくない場合は、Porter-Duff モードを使用することをお勧めします。円を含むビットマップを作成し、イメージを元のコンテンツにクリップするようなモードを使用してキャンバスにイメージを描画できます。

于 2012-01-17T14:01:35.023 に答える
29

Canvas.clipPath()API 18以降、ハードウェア アクセラレーションのサポートが再導入されました。

この問題を回避する最善の方法はsetLayerType(View.LAYER_TYPE_SOFTWARE, null)、API 11 から 17 で実行している場合にのみ呼び出すことです。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    setLayerType(LAYER_TYPE_SOFTWARE, null);
}

clipPath()また、予期しないアプリのクラッシュを避けるために、呼び出しを try-catch ブロックで囲みました。

if (doClip) {
    try {
        canvas.clipPath(clipPath);
    } catch (UnsupportedOperationException e) {
        Log.e(TAG, "clipPath() not supported");
        doClip = false;
    }
}

いずれにせよ、UnsupportedOperationException は API >= 18 では決してスローされるべきではありません。

サポートされていない描画操作を参照してください

于 2015-05-20T15:46:16.867 に答える