Androidではこれ以上サポートされていないCanvas.clippath()
-
29-10-2019 - |
質問
Android 3.0から Clippath() メソッドは、ハードウェアアクセラレーションがオンになっているデバイスではサポートされなくなりました。 論文 詳細については)。
私はキャンバスを使用していますが、丸い画像を描く必要があります。どうすればそれを行うことができますか?
*ハードウェアの加速をオフにすることはできません。他のソリューションを探しています。
回答:tnx @malcolm for your nount。実証する良い例を見つけました このテクニック, 、基本的にマスクです。
解決
Canvas.clipPath()
それ以来、ハードウェア加速度のサポートが再導入されています API 18.
問題を回避するための最良の方法は呼び出すことです setLayerType(View.LAYER_TYPE_SOFTWARE, null)
11から17までのAPIで実行している場合のみ:
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()
予測されていないアプリのクラッシュを避けるために、トライキャッチブロックで電話してください:
if (doClip) {
try {
canvas.clipPath(clipPath);
} catch (UnsupportedOperationException e) {
Log.e(TAG, "clipPath() not supported");
doClip = false;
}
}
とにかく、unsupportedoperationexceptionをAPI> = 18に投げてはいけません。
他のヒント
clipPath
ハードウェアアクセラレーションは、APIレベル18以降でのみサポートされており、APIレベルは11から17まではオフにする必要があります。
あなたが言及した記事には手がかりが含まれています:
アプリケーションがこれらの不足している機能または制限のいずれかによって影響を受ける場合、呼び出してアプリケーションの影響を受ける部分のみのハードウェアアクセラレーションをオフにすることができます setlayertype(view.layer_type_software、null). 。このようにして、他のどこでもハードウェアアクセラチンを利用することができます。見る ハードウェアアクセラレーションの制御 アプリケーションのさまざまなレベルでハードウェアアクセラレーションを有効にして無効にする方法の詳細については。
ここでの主なアイデアは、APIレベルが18未満のデバイスでサポートされていないメソッドを使用する必要があるアプリケーションの部分でハードウェアアクセラレーションを無効にすることです。特定のビューのためにそれを行うことができます。完全にオフにする必要はありませんアプリケーション全体。
ハードウェアアクセラレーションをオフにしたくない場合は、ポーターダフモードを使用することをお勧めします。円が入ったビットマップを作成してから、画像を元のコンテンツにクリップするようなモードを使用して、キャンバスに画像を描画できます。