2

Blackberryアプリを作成するには、Gradientクラスが必要です。2つの色を補間するための最も効果的な方法(速度とバッテリー寿命など)は何ですか?具体的にお願いします。

// Java, of course
int c1 = 0xFFAA0055   // color 1, ARGB
int c2 = 0xFF00CCFF   // color 2, ARGB
float st = 0          // the current step in the interpolation, between 0 and 1

これから助けてください。各色の各チャネルを分離し、それらを10進数に変換して補間する必要がありますか?もっと簡単な方法はありますか?

interpolatedChannel = red1+((red2-red1)*st)
interpolatedChannel = interpolatedChannel.toString(16)

^これは正しいことですか?モバイルアプリで速度と有効性が重要な場合、ビット演算を使用する必要がありますか?

助けて!

4

4 に答える 4

10

チャネルを分離する必要がありますが、10 進数に変換する必要はありません。

たとえば、256 の可能なグラデーションを許可する場合:

red = red1 + ((red2 - red1) * stage / 256)

EDIT:あなたはビット管理についてあまり知らないと言ったので、チャンネルを分割する簡単な方法は次のとおりです。

red = color & 0x000000ff;
green = color & 0x0000ff00;
blue = color & 0x00ff0000;
alpha = color >> 24;

そして、それらを元に戻します:

color = (alpha << 24) | blue | green | red;

ここから、詳細は通常、コンパイラの最適化によって処理されます。どちらかといえば、最適なアルゴリズムを探しています。

于 2010-04-13T15:46:40.787 に答える
7
private function interpolateColorsCompact( a:int, b:int, lerp:Number ):int
{ 
   var MASK1:int = 0xff00ff; 
   var MASK2:int = 0x00ff00; 

   var f2:int = 256 * lerp;
   var f1:int = 256 - f2;

   return   ((((( a & MASK1 ) * f1 ) + ( ( b & MASK1 ) * f2 )) >> 8 ) & MASK1 ) 
          | ((((( a & MASK2 ) * f1 ) + ( ( b & MASK2 ) * f2 )) >> 8 ) & MASK2 );

} 

これが最もコンパクトな方法かどうかはわかりませんが、最初にそれらを 3 つのチャネルに分割する従来の方法よりも少ないローカル変数と少ない演算子を使用します。

ああ、申し訳ありませんが、これは Actionscript ですが、これを Java に変換する方法を明確にする必要があります。

于 2011-01-24T21:16:13.813 に答える
2

私の答えを更新しました(より良い方法を見つけました):

次の手法では、チャネルごとに1 ビットの精度が失われますが、色をチャネルに分割する必要がないため、非常に高速です。

int color1 = ...;
int color2 = ...;
int interpolatedColor = ((color1 & 0xFEFEFEFE) >> 1) + 
                        ((color2 & 0xFEFEFEFE) >> 1));

したがって、最初に で両方の色のAND0xFEFEFEFEを計算します。これにより、チャネルごとの最後のビットが削除されます (前述のように、精度が低下します)。その後、値全体を安全に 2 で割ることができます (1 による右シフトとして実装されています)。最後に、2 つの値を合計します。

于 2010-04-13T15:44:08.797 に答える