2016-07-26 2 views
0

おはようございます。私はアンドロイド用の波のような波を作成しており、大きな問題に遭遇しています。波が4色になる必要があります。私はそれを行うことができますが、私は同じパスの4つの異なる色を与えることができる方法はありません。それは画面の開始から画面の終わりに移動する1つの単一のパスだと思います、私はその行が必要です主に私は4つの部分にパスを分割し、各部分の色を描画しなければならなかったが、Googleや他のソースは私に何かを与える(私が欲しいものに類似したものは見つけられませんでした)。 一方私は実際に私が線を描いているコードを投稿しています。複数の色のシングルパス用Android

for (int l = 0; l < mWaveCount; ++l) { 
      float midH = height/2.0f; 
      float midW = width/2.0f; 

      float maxAmplitude = midH/2f - 4.0f; 

      float progress = 1.0f - l * 1.0f/mWaveCount; 
      float normalAmplitude = (1.5f * progress - 0.5f) * mAmplitude; 

      float multiplier = (float) Math.min(1.0, (progress/3.0f * 2.0f) + (1.0f/3.0f)); 

      if (l != 0) { 
       mSecondaryPaint.setAlpha((int) (multiplier * 255)); 
      } 

      mPath.reset(); 
      for (int x = 0; x < width + mDensity; x += mDensity) { 
       float scaling = 1f - (float) Math.pow(1/midW * (x - midW), 2); 
       float y = scaling * maxAmplitude * normalAmplitude * (float) Math.sin(
         180 * x * mFrequency/(width * Math.PI) + mPhase) + midH; 
//    canvas.drawPoint(x, y, l == 0 ? mPrimaryPaint : mSecondaryPaint); 
// 
//    canvas.drawLine(x, y, x, 2*midH - y, mSecondaryPaint); 


       if (x == 0) { 
        mPath.moveTo(x, y); 
       } else { 
        mPath.lineTo(x, y); 
//     final float x2 = (x + mLastX)/2; 
//     final float y2 = (y + mLastY)/2; 
//     mPath.quadTo(x2, y2, x, y); 
       } 

       mLastX = x; 
       mLastY = y; 
      } 


      if (l == 0) { 
       canvas.drawPath(mPath, mPrimaryPaint); 
      } else { 
       canvas.drawPath(mPath, mSecondaryPaint); 
      } 
     } 

私はif (l == 0) { canvas.drawPath(mPath, mPrimaryPaint); }上の色を変更しようとしましたが、私はここでそれを変更した場合、まったくその結果、いずれかのラインが別々と全く動いていないが、それはすべきで、どちらかの色が適用されていない、propablyためではありません私はループでそれをやっています。いつも最後の色が引き出されるようになっています。あなたは私を助けてくれますか?インターネットには何もないので、小さな参考資料でさえ金です。

+0

複数の色で単一のパスを使用しようとしましたか? –

+0

ummmそれはどのように達成されましたか?私は実際に何を求めているのですか? –

+0

私はそれを正確に必要とします! –

答えて

2

とにかく、マット・ホリストが完全に正しい答えを出しても、私は最も簡単で簡単な解決策を見つけました...それはとても簡単だろうとは決して考えませんでした。世界には複数の色に分けられた、ここにあなたがgetRainbowColors()は、シェーダは長さに合わせて正しい方法で色を描画する方法を知っているので、あなたのラインを持っているとwidthたい色の配列は、パスの長さである

int[] rainbow = getRainbowColors(); 
    Shader shader = new LinearGradient(0, 0, 0, width, rainbow, 
      null, Shader.TileMode.REPEAT); 
    Matrix matrix = new Matrix(); 
    matrix.setRotate(90); 
    shader.setLocalMatrix(matrix); 
    mPrimaryPaint.setShader(shader); 

を行うことができるものですとにかく.....簡単なことではありませんか?そして、この単純なポイントに入るためにはかなり私をパージしました。あなたが見つけ出すことができるインターネットのどこにも、完全に違ったものを探しているならば、 この。

0

それぞれのセクションごとに異なる色の塗料を設定できるようです。次に、セクションごとに1つのパスを設定します。次に、画面全体を描画する際に、セクション間に切り替えポイントがある場合は、新しいパスで描画を開始します。新しいパス上でmoveTo()を最初に使用するようにして、古いパスが途切れる場所から開始するようにしてください。

+0

うーん、私はその論理を知っているが、 –

+0

私はコンセプトを理解しました。それを試してみましょう –

+0

しかし、私はそれを誤解していると思います。これは、Lが波数のループであるので、フルラインが1つの単一色で着色されることを意味しません。その間に既に描画されていなければならない各ラインを意味するのですか?一方、私は別の色で1つの線を着色する必要があります –

関連する問題