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. 后三者中的每一个都为您提供滚动发光效果的选项. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |