单路径Android

时间:2016-07-26 12:35:01

标签: android canvas path draw

美好的一天。我正在创建一个类似于wave的siri,我遇到了一个大问题。我需要波形为4种颜色。让我假设我只有一条线在屏幕上绘制相应的声音decibels.Anyway我能够做到这一点,但我无法为同一路径提供4种不同的颜色。假设它是从屏幕开始到屏幕结束的1个单一路径,我需要该行有4种不同的颜色,主要是我不得不将路径划分为4个部分并绘制每个部分的颜色,但谷歌,任何其他来源都没有给我任何东西(甚至找不到任何类似于我想要的东西)。 与此同时,我发布的代码实际上我正在绘制线条。

    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); }上的颜色,但是如果我在这里改变颜色,根本没有结果,要么线是分开的而根本没有移动,但它应该,颜色不应用,可能是因为我正在进行循环,因为我不得不每次最后一种颜色被选中绘制。无论如何,你能帮助我吗?即使是一个小参考也是我的黄金,因为互联网上根本没有任何东西。

3 个答案:

答案 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是路径的长度,因此着色器知道如何以正确的方式绘制颜色以适应路径的长度.Anyway .....很简单吗?并且非常清楚我进入这个简单的点。在互联网上你只有在寻找完全不同的东西时才能找到,而不是你可能遇到的。

答案 1 :(得分:0)

在我看来,你可以为每个部分设置一个颜色,每个部分都有不同的颜色。然后为每个部分设置一个路径。然后,当您在屏幕上绘制时,无论转换点位于各个部分之间,都可以使用新路径开始绘制。并确保首先在新路径上使用moveTo(),以便从旧路径的位置开始。

答案 2 :(得分:0)

对于我的解决方案,我尝试在onDraw调用中更改linePaint的颜色。但这是一种单色。

因此,我使用两种不同的颜料来绘制两种不同的颜色,并在画布上绘制路径。

它奏效了。希望它可以帮助某个人。