我尽量以最清晰的方式解释我的需求。想象一下我有一个带有轮廓的字体,现在我希望这个轮廓动态地改变它的颜色但不是急剧变化,就像它从一种颜色轻微变化到另一种颜色一样......一种连续的效果,它在四种颜色之间改变我的轮廓然后从第一个开始。
最佳答案
我不知道你是如何实现字体轮廓的,所以我将使用标签字体颜色变化作为例子——如果你愿意,你可以用你的轮廓来实现它。
我的想法是创建某种在每个屏幕步骤中更新的“动画管理器”——它是非常“直截了当”的分辨率,但应该确实有效。它应该按以下步骤工作:
- 如果达到目标颜色则获取下一个目标颜色
- 计算使您更接近目标的新步进颜色
- 给标签上色
现在你可以使用一些现有的机制来实现这个目标,这两个将对你有用:
HSL/HSB色系
https://en.wikipedia.org/wiki/HSL_and_HSV
是一种使用三个参数的颜色表示 - 色调、饱和度和值。这实际上对您有好处,因为要更改颜色,您只需修改其中一个参数 - 色调,其他参数可以始终相同,这将保证每种颜色都具有相同的饱和度和亮度。
不幸的是,LibGDX 中的 Color 类不支持 hsb/hsl 系统,因此您需要使用一些“外部”工具 - 最好的工具是 Oracle 实现:
int java.awt.Color.HSBtoRGB(float hue, float saturation, float brightness)
您可以使用它以这种方式创建 LibGDX 颜色:
Color color = new com.badlogic.gdx.graphics.Color( java.awt.Color.HSBtoRGB(hue, saturation, brightness) );
当然,您可以使用另一个 hsb->rgb“转换器”或自己实现 - 有一些模式可以计算 r、g 和 b 来自 h、s 和 l 的值,您可以在 Google 中轻松找到它们。
LibGDX 插值机制
Interpolation.apply(float start, float end, float a)
start 是开始颜色的值,end 是目标颜色的值。 a 参数是您必须自行计算的时间步长。
总结一下更改标签颜色的基本代码如下:
...
float a = 0.0f;
@Override
protected void step()
{
if( a < 1.0f ) a += 0.001f; // 0.01f is your time step - "how fast change"
label.getStyle().fontColor = new com.badlogic.gdx.graphics.Color( java.awt.Color.HSBtoRGB(Interpolation.linear.apply(0.4f, 0.9f, a), 0.5f, 0.5f) );
...
现在使用此代码,您可以创建管理器来处理实现目标,例如:
...
if( a < 1.0f ) a += 0.001f;
else
{
a = 0.0f;
someTargetColor = someValue; //someValue can be taken from an Array
}
...
问候, 迈克尔
关于android - libgdx - 如何使用动画效果更改我的字体颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206410/