ビューの背景を設定する最良の方法は何ですか? たとえば、backround の 2 つのバリアント:
- グラデーション、丸みを帯びた角、境界線のある背景
- 単色で角が丸い背景
では、ナインパッチとドローアブル xml リソースのどちらのバリアントが優れているでしょうか?
ビューの背景を設定する最良の方法は何ですか? たとえば、backround の 2 つのバリアント:
では、ナインパッチとドローアブル xml リソースのどちらのバリアントが優れているでしょうか?
私の推測では、NinePatch
ほとんどの場合、わずかに高速になります。これが私が見つけたものです。
GradientDrawable
(xml の四角形に使用されるもの) は、このコードを使用して を呼び出し、次に、、最終的におよびにCanvas
つながるネイティブ呼び出しを使用します。SkCanvas
SkDraw
SkScan
SkBlitter
一方、の draw() には、 -- ---をすぐに呼び出すネイティブ呼び出しの前にNinePatch
Java コードがほとんどなく、そこに魔法があります。そこのコードは、マークされた領域を反復処理し、その後の多数の呼び出しの後、 ( の代わりにのみ) でほぼ同じロジックを使用してものを描画しますが、最終的には同じであり、それが機能します。NinePatch.cpp
NinePatchImpl.cpp
NinePatch_draw()
SkDraw
drawRect()
drawPath()
SkScan
SkBlitter
これらすべてのコードをすぐに理解するのは非常に困難ですが、私の目を引いたのは、ネイティブ スタックに背景とストロークの両方がある場合 (こちらを参照)、いずれのシナリオでも1 つしか行わないGradientDrawable
場合に、ネイティブ スタック全体に対して 2 つの呼び出しを行うことです。NinePatch
したがって、両方のアプローチの時間を実際に測定しなくても、ほとんどの場合NinePatch
、レースに勝つと感じます。ネイティブコールスタックがほぼ同じロジックと[別のひどい単純化]を使用すると[ひどく]大まかに仮定すると、取得するパラメーターセットによって作成され、メソッドの複雑さにそれほど影響しないため、塗りつぶしとアウトラインよりも約 2 倍高速であることがわかります。通常の 9 セクションの 9-Patch を使用する場合 (つまり、非常に多くのマーカーで 9-Patch を細断しないでください。ピースの反復が非常に手間がかかります)。drawRect()
drawPath()
NinePatch
GradientDrawable
NinePatch
GradientDrawable
これに出くわし、この件について詳しく知っている(および/またはネイティブコードの複雑さをよりよく見積もっている)人は誰でも、私が間違っている場合は修正してください。
PSええ、これはあまりストレートな答えではないことはわかっています