我正在尝试制作一个按钮,当鼠标指向它时该按钮会发光。后台必须有一个计时器来控制这些颜色的平滑淡入和淡出。它不会从一种颜色跳到下一种颜色,而是逐渐淡入下一种颜色。
现在我的问题是,当它淡出回常规颜色时,它不会锁定其最终颜色。事实上,它不断地从亮处跳到暗处。
这是我的一个自定义按钮,我不会发布其代码,但可以将此代码放置到具有鼠标进入/退出事件和颜色属性的任何内容上。
它通过设置变量FMenuDestColor
来工作。 ExtractColor
根据颜色获取 RGB 值。计时器比较当前颜色和目标颜色之间的每个 RGB channel 。然后计时器修改当前颜色以淡入下一个。这些计算是在名为 CalcColorFade
的函数中完成的 - 每个 channel 运行 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), 0, 255)
else
Result:= EnsureRange(Trunc(C1 * RGB_MULT), 0, 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, G1, B1);
ExtractColor(FMenuDestColor, R2, G2, B2);
R3:= CalcColorFade(R1, R2);
G3:= CalcColorFade(G1, G2);
B3:= CalcColorFade(B1, B2);
MenuButton.Color:= RGB(R3, G3, 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 模式?
然后您可以设置色调 (0-359),并控制饱和度、亮度和 alpha。
后三个中的每一个都为您提供滚动发光效果的选项。
关于delphi - 如何操纵颜色来产生实时发光效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662893/