【问题标题】:Multiple colors for single path Android单路径Android的多种颜色
【发布时间】:2016-11-30 02:43:05
【问题描述】:

美好的一天。我正在为 android 创建一个类似 siri 的 wave,但遇到了一个大问题。我需要 4 种颜色的 wave。假设我只有一条线根据声音在屏幕上绘制分贝。无论如何我都能做到,但我无法为同一路径提供 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); } 上更改颜色,但如果我在这里更改它,则根本没有结果,要么线是分开的,根本没有移动,但它应该,要么不应用颜色,可能是因为我是就像我必须做的那样循环进行,每次选择最后一种颜色来绘制。无论如何,你能帮我吗?即使是一个小的参考对我来说也是黄金,因为互联网上真的什么都没有。

【问题讨论】:

  • 您是否尝试过使用多色的单路径?
  • 嗯,这是如何实现的?这就是我真正要问的......
  • 我正是需要这个!
  • 如果你试图绘制相同的路径意味着你为什么使用.mPath.reset()??尝试删除它
  • 如果我不使用reset,屏幕上会画上百万条路径

标签: android canvas path draw


【解决方案1】:

无论如何,即使马特霍斯特的回答完全正确,我找到了最简单和最简单的解决方案......我从没想过会这么容易。无论如何,如果世界上有人需要将路径分成多种颜色,这里是你能做的

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嗯我知道这个逻辑,但它只是逻辑,很难实现
    • 但我猜你误解了,这是否意味着整条线将以我指定的一种颜色着色,因为 L 是波数循环,意味着每条线已经必须被绘制而不是为每个坐标绘制?同时我需要一条线以不同的颜色着色
    • hmmm 但是画线处于使用每个坐标的状态,所以它可以帮助我尝试一下
    • 啊,我看到您在单个路径上使用 lineTo,然后在最后渲染该路径?如果您实际上创建了 X 路径(无论您想要多少颜色)并根据您在 X 上的距离,您只调用这些 X 路径之一的 addLine() 怎么办?
    • hmmmmm 听起来很有趣,但我什么都不懂:我的意思是我不明白为什么要使用 addLine 以及它实际上会做什么?
    【解决方案3】:

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

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

    它奏效了。希望它可以帮助那里的人。

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 2015-09-18
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2018-11-16
      • 2023-04-10
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多