8

アプリでハードウェアアクセラレーションを有効にしていますが、ストロークキャップなどに問題があったため、ビューの1つでハードウェアアクセラレーションを無効にしました。

今、私はGooglePlayクラッシュエラーコンソールでこのスタックトレースを取得しています:

java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:287)
at com.myapp.MyCustomView.onDraw(SourceFile:288)
at android.view.View.draw(View.java:9310)
at android.view.View.getDisplayList(View.java:8773)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2298)
...
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:609)
at android.view.ViewRoot.draw(ViewRoot.java:1634)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1450)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2094)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
...

android:hardwareAccelerated="true"AndroidManifest.xmlで指定しました。ただし、カスタムビューのコンストラクターでハードウェアアクセラレーションを特に無効にしました。

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            // ... code omitted

            // disable acceleration because Paint.setStrokeCap(Cap.ROUND) is not working otherwise
            Compatibility.disableHardwareAcceleration(this);
    }

互換性は次のとおりです。

public class Compatibility {
        // View.setLayerType() was introduced in Honeycomb
        private static Method setLayerTypeMethod = getMethod(View.class, "setLayerType", int.class,
                        Paint.class);

        private static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
                try {
                        return clazz.getMethod(name, parameterTypes);
                }
                catch (NoSuchMethodException e) {
                        return null;
                }
        }

        private Compatibility() {
        }

        public static void disableHardwareAcceleration(View view) {
                try {
                        if (setLayerTypeMethod != null) {
                                int layerType = 1; // View.LAYER_TYPE_SOFTWARE
                                setLayerTypeMethod.invoke(view, layerType, null);
                        }
                }
                catch (Exception ignored) {
                }
        }
}

残念ながら、クラッシュエラーコンソールにはAndroidOSのバージョンやデバイスに関する情報は表示されません。

何が起こっているのか考えてみませんか?

4

1 に答える 1

6

LAYER_TYPE_SOFTWAREが設定されていても、ハードウェアアクセラレーションを使用してビューが描画されるという既知の問題があります。詳細はこちら

回避策として、2つのことを行うことができます

  1. Canvas.isHardwareAccelerated()を使用して、問題のあるコードをスキップします。
  2. 問題のあるものをビットマップに描画し、canvas.drawBitmap()を使用してハードウェアアクセラレーションビューに描画します。
于 2012-04-16T12:36:55.287 に答える