单一路径的多种颜色 Android
Multiple colors for single path Android
很好 day.I 我正在为 android 创建一个类似 siri 的 wave,我遇到了一个很大的 issue.I 需要 wave 在 4 colors.Lets 假设我只有一个根据语音在屏幕上绘制的单行 decibels.Anyway 我能够做到,但我无法为相同的内容提供 4 种不同的颜色 path.Assume 它是从屏幕移动的 1 条路径从开始到屏幕结束,我需要那条线有 4 种不同的颜色,主要是我必须将路径分成 4 部分并为每个部分绘制颜色,但是 google 和任何其他来源都没有给我任何东西(不是甚至发现任何与我想要的相似的东西)。
同时,我将代码发布到我实际画线的地方。
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);
}
上更改颜色,但如果我在这里更改它,则根本没有结果,要么线条是分开的并且根本没有移动,但它应该,要么没有应用颜色,可能是因为我不得不循环执行此操作,每次选择最后一种颜色 draw.Anyway 你能帮帮我吗?即使是一个小参考对我来说也是黄金,因为互联网上真的什么都没有。
在我看来,您可以为每个部分设置一种颜色,每种颜色都不同。然后也为每个部分设置一个路径。然后,当您在屏幕上绘制时,无论区域之间的转换点在哪里,都可以使用新路径开始绘制。并确保首先在新路径上使用 moveTo(),以便它从旧路径停止的地方开始。
无论如何,尽管 Matt Horst 的回答完全正确,但我找到了最简单最简单的解决方案...我从没想过会如此 easy.Anyway 如果世界上有人需要将一条路径分为多种颜色,这是您可以做的
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
是路径的长度,因此着色器知道如何以正确的方式绘制颜色以适应长度path.Anyway .....很简单,不是吗?并且非常清除我进入这个简单的 point.Nowhere 在互联网上你只能在你正在寻找完全不同的东西时才能找到,而不是你可能会来穿过这个。
对于我的解决方案,我尝试在 onDraw 调用中更改 linePaint 的颜色。但它绘制的是一种颜色。
所以我使用了两种不同的颜料来绘制两种不同的颜色并在 canvas 上绘制路径。
它奏效了。希望它能帮助那里的人。
很好 day.I 我正在为 android 创建一个类似 siri 的 wave,我遇到了一个很大的 issue.I 需要 wave 在 4 colors.Lets 假设我只有一个根据语音在屏幕上绘制的单行 decibels.Anyway 我能够做到,但我无法为相同的内容提供 4 种不同的颜色 path.Assume 它是从屏幕移动的 1 条路径从开始到屏幕结束,我需要那条线有 4 种不同的颜色,主要是我必须将路径分成 4 部分并为每个部分绘制颜色,但是 google 和任何其他来源都没有给我任何东西(不是甚至发现任何与我想要的相似的东西)。 同时,我将代码发布到我实际画线的地方。
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);
}
上更改颜色,但如果我在这里更改它,则根本没有结果,要么线条是分开的并且根本没有移动,但它应该,要么没有应用颜色,可能是因为我不得不循环执行此操作,每次选择最后一种颜色 draw.Anyway 你能帮帮我吗?即使是一个小参考对我来说也是黄金,因为互联网上真的什么都没有。
在我看来,您可以为每个部分设置一种颜色,每种颜色都不同。然后也为每个部分设置一个路径。然后,当您在屏幕上绘制时,无论区域之间的转换点在哪里,都可以使用新路径开始绘制。并确保首先在新路径上使用 moveTo(),以便它从旧路径停止的地方开始。
无论如何,尽管 Matt Horst 的回答完全正确,但我找到了最简单最简单的解决方案...我从没想过会如此 easy.Anyway 如果世界上有人需要将一条路径分为多种颜色,这是您可以做的
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
是路径的长度,因此着色器知道如何以正确的方式绘制颜色以适应长度path.Anyway .....很简单,不是吗?并且非常清除我进入这个简单的 point.Nowhere 在互联网上你只能在你正在寻找完全不同的东西时才能找到,而不是你可能会来穿过这个。
对于我的解决方案,我尝试在 onDraw 调用中更改 linePaint 的颜色。但它绘制的是一种颜色。
所以我使用了两种不同的颜料来绘制两种不同的颜色并在 canvas 上绘制路径。
它奏效了。希望它能帮助那里的人。