Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android libgdx-如何使用动画效果更改我的字体颜色_Android_Animation_Fonts_Colors_Libgdx - Fatal编程技术网

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

Android libgdx-如何使用动画效果更改我的字体颜色,android,animation,fonts,colors,libgdx,Android,Animation,Fonts,Colors,Libgdx,我试图以最清晰的方式解释我需要什么。假设我有一个带有轮廓的字体,现在我想让这个轮廓动态地改变它的颜色,但不要急剧地改变,就像它从一种颜色到另一种颜色稍微改变一样。。。一种连续效果,在四种颜色之间更改我的大纲,然后从第一种颜色重新开始。我不知道您是如何实现字体大纲的,因此我将使用标签字体颜色更改作为示例-如果您愿意,您可以用大纲实现它 我的想法是创建某种“动画管理器”,在每一个屏幕步骤中进行更新-这是非常“直接”的分辨率,但肯定会工作。它应按以下步骤工作: 如果达到目标颜色,则获取下一个目标颜色

我试图以最清晰的方式解释我需要什么。假设我有一个带有轮廓的字体,现在我想让这个轮廓动态地改变它的颜色,但不要急剧地改变,就像它从一种颜色到另一种颜色稍微改变一样。。。一种连续效果,在四种颜色之间更改我的大纲,然后从第一种颜色重新开始。

我不知道您是如何实现字体大纲的,因此我将使用标签字体颜色更改作为示例-如果您愿意,您可以用大纲实现它

我的想法是创建某种“动画管理器”,在每一个屏幕步骤中进行更新-这是非常“直接”的分辨率,但肯定会工作。它应按以下步骤工作:

  • 如果达到目标颜色,则获取下一个目标颜色
  • 计算使您更接近目标的新步骤颜色
  • 将颜色应用于标签
  • 现在,您可以使用一些现有机制来实现这一目标,这两种机制将对您有用:

    HSL/HSB颜色系统

    Interpolation.apply(float start, float end, float a)
    

    是一种使用三个参数的颜色表示法-色调、饱和度和值。这实际上对您有好处,因为要更改颜色,您只需要修改其中一个参数-色调,另一个参数可以始终相同,这将保证每种颜色都具有相同的饱和度和亮度

    不幸的是,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“转换器”或自己实现它-有一些模式可以从hsl计算rgb值,您可以在谷歌上轻松找到它们

    LibGDX插值机制

    Interpolation.apply(float start, float end, float a)
    
    开始是你的乞讨颜色的值,结束是你的目标颜色的值。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) );
    ...
    
    。。。
    浮球a=0.0f;
    @凌驾
    受保护的无效步骤()
    {
    如果(a<1.0f)a+=0.001f;//0.01f是您的时间步长-“变化有多快”
    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
    }
    ...
    
    。。。
    如果(a<1.0f)a+=0.001f;
    其他的
    {
    a=0.0f;
    someTargetColor=someValue;//可以从数组中获取someValue
    }
    ...
    
    问候,,
    Michał

    试试Android Property Animator:一个简单但不是标准的解决方案是制作一个浮点型数组来保存所需动画颜色的rgb值。这里出于明显的原因制作4个以上的条目,然后在每60帧调用后使用ur render方法使用font.setcolor并从您选择的颜色中进行选择。虽然有点冗长,但可以解决问题这就是目的。P.s当没有其他解决方案出现在脑海中并且截止日期即将到来时,我将作为最后手段来做。没有任何ide其他人会为您键入此内容。使用不同的字体/文本进行2次相同的字体/文本,覆盖它们,并在运行时更改alpha。您甚至可以使用多种颜色来完成此操作。最好的解决方案是计算根据增量在运行时计算颜色,并在渲染前进行设置。编写一个自定义“文本框”,它会自动设置更新内部的颜色,并在渲染中进行渲染。(普通演员)如果我使用精灵而不是字体会怎么样?不确定如何使用轮廓制作一个