2016-07-26 49 views
0

美好的一天。我爲Android創建了一個類似波浪的siri,我遇到了一個大問題。我需要波形爲4種顏色。讓我們假設我只有一條線正在繪製屏幕相應的語音分貝。總之,我能夠做到這一點,但我無法爲同一路徑提供4種不同的顏色。假設它是1個單一路徑,從屏幕開始移動到屏幕結束,我需要該行有4種不同的顏色,主要是我必須將路徑分成4個部分並繪製每個部分的顏色,但谷歌和其他任何源都不給我任何東西(甚至沒有發現任何與我想要的相似的東西)。 同時我發佈的代碼實際上是在畫線。單一路徑的多種顏色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

嗯,這是怎麼實現的?那是我真正要求的。 –

+0

我需要那個! –

回答

2

無論如何,即使馬特霍斯特答案完全正確,我發現了最簡單和最簡單的解決方案...我從來沒有想過它會這麼容易。無論如何,如果在世界上有人需要將路徑分成多種顏色,這裏是你可以做什麼

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); 

哪裏getRainbowColors()是你希望你的線的顏色數組有和width在路徑的長度,以便將Shader知道如何繪製的顏色,以適應長度正道的路徑。任何方式.....容易不是它?和漂亮的清除我很多,以進入這個簡單的點。在互聯網上,只有當你正在尋找完全不同的東西,你可能會發現,你可能會遇到 這個。

0

在我看來,你可以爲每個部分設置一個油漆,每個部分都有不同的顏色。然後爲每個部分設置一條路徑。然後,當您在屏幕上繪製時,無論轉換點位於節之間的哪個位置,都可以使用新路徑開始繪製。並確保首先在新路徑上使用moveTo(),以便從舊路徑離開的位置開始。

+0

嗯我知道邏輯,但它只是邏輯,非常難實施 –

+0

好吧,我明白這個概念,讓我試試 –

+0

,但我想你誤解了它,這不意味着一條完整的線將被指定爲單一顏色,因爲L是波數循環,這意味着每條線已經必須繪製,而不是每個座標?同時我需要一條線以不同顏色着色 –