2016-07-26 85 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是波数循环,这意味着每条线已经必须绘制,而不是每个坐标?同时我需要一条线以不同颜色着色 –