11

ビューの背景を設定する最良の方法は何ですか? たとえば、backround の 2 つのバリアント:

  1. グラデーション、丸みを帯びた角、境界線のある背景
  2. 単色で角が丸い背景

では、ナインパッチとドローアブル xml リソースのどちらのバリアントが優れているでしょうか?

4

1 に答える 1

17

私の推測では、NinePatchほとんどの場合、わずかに高速になります。これが私が見つけたものです。

GradientDrawable(xml の四角形に使用されるもの) は、このコードを使用して を呼び出し、次に、、最終的におよびにCanvasつながるネイティブ呼び出しを使用します。SkCanvasSkDrawSkScanSkBlitter

一方、の draw() には、 -- ---をすぐに呼び出すネイティブ呼び出しの前にNinePatchJava コードがほとんどなく、そこに魔法があります。そこのコードは、マークされた領域を反復処理し、その後の多数の呼び出しの後、 ( の代わりにのみ) でほぼ同じロジックを使用してものを描画しますが、最終的には同じであり、それが機能します。NinePatch.cppNinePatchImpl.cppNinePatch_draw()SkDrawdrawRect()drawPath()SkScanSkBlitter

これらすべてのコードをすぐに理解するのは非常に困難ですが、私の目を引いたのは、ネイティブ スタックに背景とストロークの両方がある場合 (こちらを参照)、いずれのシナリオでも1 つしか行わないGradientDrawable場合に、ネイティブ スタック全体に対して 2 つの呼び出しを行うことです。NinePatch

したがって、両方のアプローチの時間を実際に測定しなくても、ほとんどの場合NinePatch、レースに勝つと感じます。ネイティブコールスタックがほぼ同じロジックと[別のひどい単純化]を使用すると[ひどく]大まかに仮定すると、取得するパラメーターセットによって作成され、メソッドの複雑さにそれほど影響しないため、塗りつぶしとアウトラインよりも約 2 倍高速であることがわかります。通常の 9 セクションの 9-Patch を使用する場合 (つまり、非常に多くのマーカーで 9-Patch を細断しないでください。ピースの反復が非常に手間がかかります)。drawRect()drawPath()NinePatchGradientDrawableNinePatchGradientDrawable

これに出くわし、この件について詳しく知っている(および/またはネイティブコードの複雑さをよりよく見積もっている)人は誰でも、私が間違っている場合は修正してください。

PSええ、これはあまりストレートな答えではないことはわかっています

于 2013-08-13T09:34:30.530 に答える