web-dev-qa-db-ja.com

Androidこれ以上)でサポートされていないCanvas.clipPath()を回避する

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

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

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

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

24
Ilya Gazman

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

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

_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でスローされるべきではありません。

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

28
araks

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

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

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

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

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

42
Malcolm