加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何操纵颜色以提供实时发光效果?

发布时间:2020-12-15 09:52:26 所属栏目:大数据 来源:网络整理
导读:我正在尝试制作一个按钮,当鼠标指向它时会发光.背景中必须有一个计时器来控制这些颜色的平滑淡入和淡出.它不会从一种颜色跳到另一种颜色,它逐渐淡化为下一种颜色. 现在我的问题是,当它淡化回常规颜色时,它不会锁定到它的最终颜色.事实上,它一直从光明到黑暗.
我正在尝试制作一个按钮,当鼠标指向它时会发光.背景中必须有一个计时器来控制这些颜色的平滑淡入和淡出.它不会从一种颜色跳到另一种颜色,它逐渐淡化为下一种颜色.

现在我的问题是,当它淡化回常规颜色时,它不会锁定到它的最终颜色.事实上,它一直从光明到黑暗.

这是我的一个自定义按钮,我不打算发布代码,但是这个代码可以放在鼠标输入/退出事件和颜色属性的任何东西上.

它通过设置变量FMenuDestColor来工作. ExtractColor根据颜色获取RGB值.计时器比较当前颜色和目标颜色之间的每个RGB通道.然后计时器修改当前颜色以淡入下一个颜色.这些计算在名为CalcColorFade的函数中完成 – 每个通道运行3次.

procedure ExtractColor(const Color: TColor; var R,G,B: Byte);
begin
  R:= GetRValue(Color);
  G:= GetGValue(Color);
  B:= GetBValue(Color);
end;

function CalcColorFade(const C1,C2: Byte): Byte;
const
  RGB_MULT = 1.2;
  RGB_SENS = 5;
begin
  if C1 <> C2 then begin    
    if (C1 >= C2 - RGB_SENS) and (C1 <= C2 + RGB_SENS) then
      Result:= C2
    else
      if C1 > C2 then
        Result:= EnsureRange(Trunc(C1 / RGB_MULT),255)
      else
        Result:= EnsureRange(Trunc(C1 * RGB_MULT),255);
  end else begin
    Result:= C2;
  end;
end;

procedure TfrmMain.tmrMenuGlowTimer(Sender: TObject);
var
  R1,G1,B1: Byte;
  R2,G2,B2: Byte;
  R3,G3,B3: Byte;
begin
  if MenuButton.Color <> FMenuDestColor then begin
    ExtractColor(MenuButton.Color,R1,B1);
    ExtractColor(FMenuDestColor,R2,B2);
    R3:= CalcColorFade(R1,R2);
    G3:= CalcColorFade(G1,G2);
    B3:= CalcColorFade(B1,B2);
    MenuButton.Color:= RGB(R3,B3);
  end;
end;

procedure TfrmMain.MenuButtonMouseEnter(Sender: TObject);
begin
  FMenuDestColor:= clBlue;
end;

procedure TfrmMain.MenuButtonMouseLeave(Sender: TObject);
begin
  FMenuDestColor:= clNavy;
end;

将鼠标指向它,它将淡入下一个颜色.但是把鼠标从它上面移开,它有点不会锁定在其原始颜色的位置 – 它在光明与黑暗之间来回摇晃.

我假设必须有一个更清洁的方法来完成我正在做的事情,我也对这些建议持开放态度.

计时器的间隔为70,常数为1.2,当改为1.1时,它的工作正常.所以有关将它改为1.2的事情搞砸了.

解决方法

为什么不切换到HSB / HSV模式?

然后你可以设置你的Hue(0-359),并控制饱和度,亮度和alpha.

后三者中的每一个都为您提供滚动发光效果的选项.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读