AndroidはAPIレベル11以降、ハードウェアアクセラレーションをサポートしています。問題は、ハードウェアアクセラレーションがオンになっている場合、すべての描画操作がサポートされるわけではないことです。そしてCanvas.clipPath
それらの1つです。サポートされていない操作の完全なリストはここにあります
clipPath
ハードウェアアクセラレーションを使用せずに、または単に無効にすることなく、必要なものを実装してみることができます。
アプリケーションレベルでハードウェアアクセラレーションを無効にするには、targetSdkVersion
11以上であり、 :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);
}