android - libgdx - 如何使用动画效果更改我的字体颜色

标签 android animation fonts colors libgdx

我尽量以最清晰的方式解释我的需求。想象一下我有一个带有轮廓的字体,现在我希望这个轮廓动态地改变它的颜色但不是急剧变化,就像它从一种颜色轻微变化到另一种颜色一样......一种连续的效果,它在四种颜色之间改变我的轮廓然后从第一个开始。

最佳答案

我不知道你是如何实现字体轮廓的,所以我将使用标签字体颜色变化作为例子——如果你愿意,你可以用你的轮廓来实现它。

我的想法是创建某种在每个屏幕步骤中更新的“动画管理器”——它是非常“直截了当”的分辨率,但应该确实有效。它应该按以下步骤工作:

  1. 如果达到目标颜色则获取下一个目标颜色
  2. 计算使您更接近目标的新步进颜色
  3. 给标签上色

现在你可以使用一些现有的机制来实现这个目标,这两个将对你有用:

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“转换器”或自己实现 - 有一些模式可以计算 rgb 来自 hsl 的值,您可以在 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/

相关文章:

java - 以编程方式锁定屏幕

带有双破折号的 Android XML 注释

html - 使表格单元格逐渐消失,不留空白

html - 如何在CSS语句中使用 "Monotype Corsiva"字体?

asp.net - 在 Azure 上部署网站时未加载字体

java - Android:java.lang.IllegalArgumentException:错误对话线程 ID:15555215554

V1 上的 Android map 使用为 Maps API V2 注册的 API key

java - 如何让这个java动画流畅呢?

android - 如何在动画之间添加延迟

Xcode 4 字体默认为 Helvetica