Android でバグを見つけたのか、それとも自分のコードにバグがあるのかわかりません。これは、私が読んだハードウェアアクセラレーション バグの別の (または新しい) 兆候かもしれないと思いました。Android 4.2 で実行していandroid:hardwareAccelerated="true"
ますが、マニフェスト ファイルを設定しても問題は解決しません。
問題はカスタム ビューにあります。表示が複雑なので、すべてのフィールドを個別に指定するのではなくPath
、SVG ファイルを解析し、<path>
要素のデータ仕様からパスを作成します。View
SGV パーサーは、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 次曲線よりも高速であると想定しています。だから私はこれを投稿して、他の誰かがこの問題に遭遇したかどうか、そしてそれに対する修正があるかどうかを尋ねます.
いつもありがとうございます。