当前位置: 首页 > 面试题库 >

如何缓慢地将对象的颜色从一种改变为另一种?

沈单弓
2023-03-14
问题内容

我正在尝试实现一种方案,其中对象的颜色从一种颜色缓慢变为另一种颜色。

我的初始颜色为targetColor,最终颜色为updateColor。changingSpeed变量设置为5。

我必须使用的机制是

  1. 使用getRed()getGreen()getBlue()获得了红,绿,蓝三基色
  2. 通过targetColor–color = [dr dg db]计算目标颜色的差异
  3. 通过将向量的范数除以[dr dg db] T来规范化[dr dg db] T(请注意div除以零)
  4. 通过更改Speed乘以以控制更改颜色的速度
  5. 将颜色更新为color + [dr’dg’db’]

到目前为止,我已经能够进行以下代码:

dr=targetColor.getRed()-updateColor.getRed();
        dg=targetColor.getGreen()-updateColor.getGreen();
        db=targetColor.getBlue()-updateColor.getBlue();

        double nrml= Math.sqrt((dr*dr)+(dg*dg)+(db*db));

        dr=dr/nrml;
        dg=dg/nrml;
        db=db/nrml;

如何执行第四步和第五步?可以请任何人通过代码示例指定如何执行此操作吗?另外,请检查以上代码是否正确。


问题答案:

这是一个示例,当您在组件之间移动时,背景会逐渐变暗:

import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;
import java.util.ArrayList;
import javax.swing.*;

public class Fader
{
    //  background color when component has focus
    private Color fadeColor;

    //  steps to fade from original background to fade background
    private int steps;

    //  apply transition colors at this time interval
    private int interval;

    //  store transition colors from orginal background to fade background
    private Hashtable backgroundColors = new Hashtable();

    /*
     *  Fade from a background color to the specified color using
     *  the default of 10 steps at a 50 millisecond interval.
     *
     *  @param fadeColor the temporary background color
     */
    public Fader(Color fadeColor)
    {
        this(fadeColor, 10, 50);
    }

    /*
     *  Fade from a background color to the specified color in the
     *  specified number of steps at the default 5 millisecond interval.
     *
     *  @param fadeColor the temporary background color
     *  @param steps     the number of steps to fade in the color
     */
    public Fader(Color fadeColor, int steps)
    {
        this(fadeColor, steps, 50);
    }

    /*
     *  Fade from a background color to the specified color in the
     *  specified number of steps at the specified time interval.
     *
     *  @param fadeColor the temporary background color
     *  @param steps     the number of steps to fade in the color
     *  @param intevral  the interval to apply color fading
     */
    public Fader(Color fadeColor, int steps, int interval)
    {
        this.fadeColor = fadeColor;
        this.steps = steps;
        this.interval = interval;
    }

    /*
     *  Add a component to this fader.
     *
     *  The fade color will be applied when the component gains focus.
     *  The background color will be restored when the component loses focus.
     *
     *  @param component apply fading to this component
    */
    public Fader add(JComponent component)
    {
        //  Get colors to be used for fading

        ArrayList colors = getColors( component.getBackground() );

        //  FaderTimer will apply colors to the component

        new FaderTimer( colors, component, interval );

        return this;
    }

    /*
    **  Get the colors used to fade this background
    */
    private ArrayList getColors(Color background)
    {
        //  Check if the color ArrayList already exists

        Object o = backgroundColors.get( background );

        if (o != null)
        {
            return (ArrayList)o;
        }

        //  Doesn't exist, create fader colors for this background

        ArrayList colors = new ArrayList( steps + 1 );
        colors.add( background );

        int rDelta = ( background.getRed() - fadeColor.getRed() ) / steps;
        int gDelta = ( background.getGreen() - fadeColor.getGreen() ) / steps;
        int bDelta = ( background.getBlue() - fadeColor.getBlue() ) / steps;

        for (int i = 1; i < steps; i++)
        {
            int rValue = background.getRed() - (i * rDelta);
            int gValue = background.getGreen() - (i * gDelta);
            int bValue = background.getBlue() - (i * bDelta);

            colors.add( new Color(rValue, gValue, bValue) );
        }

        colors.add( fadeColor );
        backgroundColors.put(background, colors);

        return colors;
    }

    class FaderTimer implements FocusListener, ActionListener
    {
        private ArrayList colors;
        private JComponent component;
        private Timer timer;
        private int alpha;
        private int increment;

        FaderTimer(ArrayList colors, JComponent component, int interval)
        {
            this.colors = colors;
            this.component = component;
            component.addFocusListener( this );
            timer = new Timer(interval, this);
        }

        public void focusGained(FocusEvent e)
        {
            alpha = 0;
            increment = 1;
            timer.start();
        }

        public void focusLost(FocusEvent e)
        {
            alpha = steps;
            increment = -1;
            timer.start();
        }

        public void actionPerformed(ActionEvent e)
        {
            alpha += increment;

            component.setBackground( (Color)colors.get(alpha) );

            if (alpha == steps || alpha == 0)
                timer.stop();
        }
    }

    public static void main(String[] args)
    {
        // Create test components

        JComponent textField1 = new JTextField(10);
        textField1.setBackground( Color.YELLOW );
        JComponent textField3 = new JTextField(10);
        JComponent textField4 = new JTextField(10);
        JComponent button = new JButton("Start");
        JComponent checkBox = new JCheckBox("Check Box");

        JFrame frame = new JFrame("Fading Background");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add(textField1, BorderLayout.NORTH );
        frame.getContentPane().add(button, BorderLayout.SOUTH );
        frame.getContentPane().add(textField3, BorderLayout.WEST );
        frame.getContentPane().add(textField4, BorderLayout.EAST );
        frame.getContentPane().add(checkBox);

        //  Gradual Fading (using defaults)

//      Fader fader = new Fader( new Color(155, 255, 155) );
        Fader fader = new Fader( new Color(155, 255, 155), 10, 50 );
        fader.add( textField1 );
        fader.add( textField3 );
        fader.add( checkBox );

        //  Instant Fading

        fader = new Fader( new Color(255, 155, 155), 1, 1 );
        fader.add( textField4 );
        fader.add( button );

        frame.pack();
        frame.setVisible( true );
    }
}

它使用计时器以指定的间隔更新背景。然后,它仅根据所需的步数在两种颜色之间进行插值。



 类似资料:
  • 问题内容: 所以我有一个带有火山的图像文件。其他所有内容均为0xFFFF00FF(不透明的洋红色)。我想将包含该颜色的每个像素替换为0(透明)。到目前为止,我的方法如下所示: 这工作正常,但似乎很慢。我见过有人以其他方式执行此操作,但是我不知道发生了什么。如果有人知道更好的方法,我非常想听听。 问题答案: 为了避免遍历像素,请更改基础ColorModel。这是一个例子。以下是作者使用原始Buffe

  • 问题内容: 我想用Python更改单一颜色。 如果存在使用PIL的快速解决方案,我会更喜欢此解决方案。 此刻,我用 问题答案: 如果计算机上可用,请尝试执行以下操作: 它将使用多一点(3倍)的内存,但它应该快得多(〜5倍,但对于更大的图像,更多)。 另请注意,如果您只有RGB(而不是RGBA)图像,则上面的代码比需要的代码稍微复杂一些。但是,此示例将单独保留Alpha波段,而没有一个更简单的版本。

  • 本文向大家介绍将three.js背景更改为透明或HTML中的另一种颜色,包括了将three.js背景更改为透明或HTML中的另一种颜色的使用技巧和注意事项,需要的朋友参考一下 如果要在three.js中使用透明背景,则需要在下面给出的代码中将alpha参数传递给WebGLRenderer构造函数- 但是,要设置背景色,

  • 问题内容: 我想对Java变量进行动态转换,转换类型存储在其他变量中。 这是常规转换: 这就是我要的: 这有可能吗?谢谢! 更新资料 我正在尝试使用HashMap收到的A 填充类。 这是构造函数: 这里的问题是某些类的变量的类型是,如果接收到数字3,它会认为它是类型问题。 问题答案: 是的,可以使用反射 但这没有多大意义,因为必须将结果对象保存在类型变量中。如果你需要变量属于给定的类,则可以将其强

  • 我有两种不同格式的图像。一个是BGR,一个是黑白(只有黑白,没有灰色的彩色像素)。它是相同的精确图像(相同的大小和像素)。我想在黑白图像中找到所有的白色像素,标记下来然后在BGR图像中找到完全相同的像素(显然它们在BGR图像中是着色的),并将它们着色为黑色。我试过了,但问题是黑白图像有1个通道,而BGR图像有3个通道,所以我失败了...我正在使用C++中的opencv。谢谢你的帮助!:)

  • 我的spring应用程序中有一个功能有问题。我在同一个数据库中有两个表,它们都包含相同类型的数据(id、标题、描述和日期)。我可以从一个表中获取数据,但不知道如何插入到第二个表中。 在我的@服务层中,我可以从表A中获取数据。但不知道如何转换为另一个类对象(两个类都包含samne数据) 注入JPA储备 还有从表A获取对象的代码(TasksRepository-JpaRepository)