2

Android でバグを見つけたのか、それとも自分のコードにバグがあるのか​​わかりません。これは、私が読んだハードウェアアクセラレーション バグの別の (または新しい) 兆候かもしれないと思いました。Android 4.2 で実行していandroid:hardwareAccelerated="true"ますが、マニフェスト ファイルを設定しても問題は解決しません。

問題はカスタム ビューにあります。表示が複雑なので、すべてのフィールドを個別に指定するのではなくPath、SVG ファイルを解析し、<path>要素のデータ仕様からパスを作成します。ViewSGV パーサーは、SVG 空間と空間の間で変換するマトリックスを生成できるように、SVG 描画領域の幅と高さも抽出します。

Matrix t = new Matrix();

float scale = Math.min(viewWidth / svgWidth, viewHeight / svgHeight);
t.setScale(scale, scale);

この変換は、onDraw(Canvas)メソッドでキャンバスに適用されます。問題は、一部のパスが正常にレンダリングされ、一部が正常にレンダリングされないことです。パスに沿ってレンダリングされるテキストについても同様です。

レンダリングされるものとレンダリングされないものとの違い、つまり直線を見つけたと思います。レンダリングされたテキストは対角線上にあり、そうでないテキストは完全に水平線上にありました。テキスト パスを水平方向から移動すると、テキストがレンダリングされます。同様に、水平線を、線自体に制御点がある 3 次曲線に変更します。したがって、直線のようにレンダリングされます。これから直線カーブと呼ぶことにします。

boundingBox.left - boundingBox.right == 0バウンディング ボックス (変換前または変換後) のボリュームがゼロ (または)の場合にパスを除外するのは、Android アクセラレーション コードのバグboundingBox.top - boundingBox.bottom == 0ですか? 多分!しかし、レンダリングされないパスの別のケースがあります。パスは直線だけで構成されています。これらのパスのバウンディング ボックスにボリュームがある場合でも、レンダリングされません。パス要素の 1 つを直線から直線曲線に変更すると、パス全体が適切にレンダリングされます。

もちろん、パフォーマンスの観点から、一部の線を直線曲線としてレンダリングする必要はありません。線を描画するコードは、3 次曲線よりも高速であると想定しています。だから私はこれを投稿して、他の誰かがこの問題に遭遇したかどうか、そしてそれに対する修正があるかどうかを尋ねます.

いつもありがとうございます。

4

2 に答える 2

5

一部のデバイス/エミュレーターでレンダリングするには、Path を close() する必要があることがわかりました。既存のパスから直接作成されたパス。

たとえば、Path thisIsInvisible = new Path(existingClosedPath);existingClosedPathは私のキャンバスに問題なく描画されます。thisIsInvisible黙って現れません。しかし、thisIsInvisible.close()作成した直後に呼び出すと、うまくいきました。

Romain Guyによる興味深い投稿も見つけました。ハードウェア アクセラレーションをオンにすると、addPath() を使用して transform() と同じ仕事をするほうがよいかもしれないということです。

于 2014-06-29T22:12:32.477 に答える