Feature Request: Disable new 10.1.5 actionbutton animations
Daenarys opened this issue ยท 36 comments
I was wondering if you can add an option or make it default to hide the new action button animations that come in 10.1.5
I think theyre useless :)
Also,
Do you have any plans to implement the pre 10.x actionbutton theme?
I don't have any plans on implementing a pre 10.x theme. Masque should cover you there.
Closing this issue, as I don't think there's anything I specifically need to implement in Dominos for this.
Blizz removed the new recharge animation today so you can now remove this part from the code again
hooksecurefunc("StartChargeCooldown", function(parent)
parent.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)
They also removed the new CooldownFlash animation so you can remove this too, maybe they add it again later tho..
hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
local flash = cooldown:GetParent().CooldownFlash
if flash then
flash:Hide()
end
end)
The edge texture was probably reverted due to it not really being compatible with buttons that utilize :SetUseCircularEdge()
. When I was doing some testing, it looked pretty bad on round buttons. The edge animation seems to just rotate the texture, which works fine for a thin line, but you can see the square edges on anything larger. Maybe we'll get lucky and they'll implement a better way of doing it, like a flip book animation instead of a rotation.
As for the charge cooldown animation, I'm not sure why they removed it. It could be back later, but we'll have to see.
You can add this to restore the "old" cooldown done flash
hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
cooldown:SetDrawBling(true)
end)
Masque doesn't appear to have any way to disable things like the cast or channel progress overlaid on to spell icons, and while an entire pre-10.1.5 theme might be overkill it would be handy to be able to turn them off (if such a thing is possible).
in my addon (razernaga ui) i disabled the animations by hooking actionbutton OnUpdate and hiding them there
self:HookScript("OnUpdate", function(self)
self.CooldownFlash:Hide()
self.InterruptDisplay:Hide()
self.SpellCastAnimFrame:Hide()
self.TargetReticleAnimFrame:Hide()
end)
and to restore some old animations i added
self.cooldown:SetDrawBling(true)
hooksecurefunc("StartChargeCooldown", function(self)
self.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)
If you throw this into an addon, it should work on all stock action buttons (including Dominos). You want to avoid hooking OnUpdate, as that happens every time a frame is rendered in game. Some things may be done a bit more efficiently via using SetAlpha(0) on them to "hide"
local function hideSpellCastAnimFrame(button)
button.SpellCastAnimFrame:Hide()
end
local function hideInterruptDisplay(button)
button.InterruptDisplay:Hide()
end
local function hideTargetReticleAnimFrame(button)
button.TargetReticleAnimFrame:Hide()
end
local function hideCastAnimations(button)
button.cooldown:SetDrawBling(true)
hooksecurefunc(button, "PlaySpellCastAnim", hideSpellCastAnimFrame)
hooksecurefunc(button, "PlaySpellInterruptedAnim", hideInterruptDisplay)
hooksecurefunc(button, "PlayTargettingReticleAnim", hideTargetReticleAnimFrame)
end
hooksecurefunc("StartChargeCooldown", function(button)
button.chargeCooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
end)
-- hide the cooldown flash animation
hooksecurefunc("ActionButtonCooldown_OnCooldownDone", function(cooldown)
local cooldownFlash = cooldown:GetParent().CooldownFlash
if cooldownFlash then
cooldownFlash:Hide()
end
end)
-- register known action buttons
for _, button in pairs(ActionBarButtonEventsFrame.frames) do
hideCastAnimations(button)
end
-- and watch for any additional action buttons
hooksecurefunc(ActionBarButtonEventsFrame, "RegisterFrame", function(_, button)
hideCastAnimations(button)
end)
Interesting.
When using your code my addon uses 6-7mb memory, and with the code i posted it uses 1.0-1.5mb.
Maybe its working better for dominos? :P
Interesting.
When using your code my addon uses 6-7mb memory, and with the code i posted it uses 1.0-1.5mb.
Maybe its working better for dominos? :P
hideCastAnimations needs a check added to ensure that the button hasnโt already been registered before
https://filebin.net/xng6z6e492dudxrr
for the fix Tuller recommended above. Just put the Bar folder in your addons folder like any other addon.
Bartender does still have the old one (just tested this myself to verify), couldn't you just copy from that?
Bartender uses LibActionButton-1.0, which still uses the old style. I can't control whether action bar add-ons use custom buttons or the default buttons (Dominos uses the default buttons, while Bartender creates it own via LAB).
wait so, they changed the size of the action buttons, but not the font size for the keybindings?
They didn't need to, because at their existing size, they're fine. How the text is scaled, however, depends on how it's implemented. Masque don't change the font size at all, only the "container" for the text, to keep it in scale with the button.
so the proportions were just different because of that? if pre-DF the font made up let's say 25% of the button, because they changed the size of the buttons, now the font was just f.e. 20%? something like that? that would make sense then why the keybindings got so small after I changed the action bars back to being the size they were before DF.
Your keybindings likely got smaller because Blizzard may have implemented font scaling along with the button scaling. Font scaling is separate from font object (the container box for the text) scaling. You can resize a text block without changing the size of the font it contains, if that makes sense. That's how Masque does it.
I take it since you're replying to my message with the screenshot that you're talking about the spell proc flash animation? The old one will probably still be in the game files somewhere if I had to guess? Or do you think they just overwrote it with the new one?
The files are there. The issue is that they're implemented differently and I'd effectively have to create the a new, separate animation to replace it. When I get around to making custom animations, I'll probably just make a toned-down version of the new one, versus trying to rig the old one into the new system.
I'd like to tag on and say that a lot of people would love if you made this into a little addon of its own. I've seen many people with various disabilities and/or sensitivities on the forums complaining about the new spell flash/gcd animations. For some it's serious enough that without a fix, they'll stop playing. And I think not everyone will find your comment on this issue on this repo - putting it up on curseforge as its own thing would really help a lot of people.
Yea i agree, btw, i hate how they keep adding new stuff without giving us an option to disable or revert that new thing.. ugh
A little simpler, https://github.com/Tuller/RemoveActionAnimations
Nice! i guess the SpellActivationAlert (spell proc flash) requires a bit more work since all the animations and durations etc were changed :)
For that, youโd probably want to look at something like LibActionButton. It has its own implementation for that which could likely be reapplied to the stock action buttons
I had to tweak the scaling via masque btw because with dragonflight something about the scaling got changed, making all my actionbars way bigger when I first logged in.
For what it's worth, this is because action buttons were increased from 36 x 36 to 45 x 45 in Dragonflight.
Also, I'm looking into adding options to Masque for disabling the new animations. At least that will be something until I can add custom animations.
This should fix the proc flash size, add it underneath the code tuller provided.
hooksecurefunc("ActionButton_SetupOverlayGlow", function(parent)
if parent.SpellActivationAlert then
parent.SpellActivationAlert:ClearAllPoints()
parent.SpellActivationAlert:SetPoint("TOPLEFT", -7.20, 7.20)
parent.SpellActivationAlert:SetPoint("BOTTOMRIGHT", 7.20, -7.20)
parent.SpellActivationAlert.ProcStartFlipbook:ClearAllPoints()
parent.SpellActivationAlert.ProcStartFlipbook:SetPoint("TOPLEFT", -37, 37)
parent.SpellActivationAlert.ProcStartFlipbook:SetPoint("BOTTOMRIGHT", 37, -37)
end
end)
you can tweak the setpoints values if its too large/small
Stole this from another addon to tame the spell proc animation:
-- from HideActionBarAnimations
-- Golden Border Procc
hooksecurefunc("ActionButton_ShowOverlayGlow", function(button)
if button.SpellActivationAlert.ProcStartAnim:IsPlaying() then
--Hack to hide the animation start if we do
--button.SpellActivationAlert.ProcStartAnim:Stop()
--then the texture breaks in horrendous ways
button.SpellActivationAlert:SetAlpha(0)
C_Timer.After(0.26, function()
button.SpellActivationAlert:SetAlpha(0.7)
end)
-- Interface\\SpellActivationOverlay\\IconAlert
-- Interface\\SpellActivationOverlay\\IconAlertAnts
-- ActionButton_HideOverlayGlow(self) -- Perma Hide it?
end
end)
Originally, it set the alpha back to 1 but it was still very bright.
Adding this to the end of the above makes the action bars mostly bearable for me now.
but I think for me because of how I've scaled everything, it will still look off with the spacing and all even if you implement a texture of your own design, correct?
Masque doesn't currently allow adjusting the size of Spell Alerts by skins. I'm planning on changing that. This will leave it to the skin author(s) to make sure their skins are set up correctly.
and I can hear you thinking "just switch to bartender" and okay, yes, but
I try not to influence what users use.
40+ alts.. and action bar profiles/action bar saver apparently don't work for bartender.
Ability assignments on action bars is generally saved server-side. ABS saves a set-up locally and then applies it, which then prompts the server to update. If it's not working with Bartender, it likely because BT creates its own buttons, though I was under the impression that it tied into the native API. I could be wrong.
function BindableButton:UpdateHotkeys()
_G[self:GetName()..'HotKey']:SetFont("Fonts\\ARIALN.TTF", 13, "OUTLINE")
local key = getButtonHotkey(self)
if key ~= '' and Addon:ShowBindingText() then
self.HotKey:SetText("|cffffffff"..key)
self.HotKey:Show()
In bindablebutton.lua I changed that and i was able to get the size and colour back
Don't know if Tuller can make a cleaner implementation, but this should restore the old spell proc animations :)
hooksecurefunc("ActionButton_SetupOverlayGlow", function(button)
if button.SpellActivationAlert then
button.SpellActivationAlert:SetAlpha(0)
end
if button.ActionButtonOverlay then
return;
end
local name = button:GetName()
local overlay = CreateFrame("Frame", nil, button)
-- spark
overlay.spark = overlay:CreateTexture(name .. "Spark", "BACKGROUND")
overlay.spark:SetPoint("CENTER")
overlay.spark:SetAlpha(0)
overlay.spark:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
overlay.spark:SetTexCoord(0.00781250, 0.61718750, 0.00390625, 0.26953125)
-- inner glow
overlay.innerGlow = overlay:CreateTexture(name .. "InnerGlow", "ARTWORK")
overlay.innerGlow:SetPoint("CENTER")
overlay.innerGlow:SetAlpha(0)
overlay.innerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
overlay.innerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
-- inner glow over
overlay.innerGlowOver = overlay:CreateTexture(name .. "InnerGlowOver", "ARTWORK")
overlay.innerGlowOver:SetPoint("TOPLEFT", overlay.innerGlow, "TOPLEFT")
overlay.innerGlowOver:SetPoint("BOTTOMRIGHT", overlay.innerGlow, "BOTTOMRIGHT")
overlay.innerGlowOver:SetAlpha(0)
overlay.innerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
overlay.innerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
-- outer glow
overlay.outerGlow = overlay:CreateTexture(name .. "OuterGlow", "ARTWORK")
overlay.outerGlow:SetPoint("CENTER")
overlay.outerGlow:SetAlpha(0)
overlay.outerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
overlay.outerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
-- outer glow over
overlay.outerGlowOver = overlay:CreateTexture(name .. "OuterGlowOver", "ARTWORK")
overlay.outerGlowOver:SetPoint("TOPLEFT", overlay.outerGlow, "TOPLEFT")
overlay.outerGlowOver:SetPoint("BOTTOMRIGHT", overlay.outerGlow, "BOTTOMRIGHT")
overlay.outerGlowOver:SetAlpha(0)
overlay.outerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
overlay.outerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
-- ants
overlay.ants = overlay:CreateTexture(name .. "Ants", "OVERLAY")
overlay.ants:SetPoint("CENTER")
overlay.ants:SetAlpha(0)
overlay.ants:SetTexture([[Interface\SpellActivationOverlay\IconAlertAnts]])
overlay.OnUpdate = function(button, elapsed)
AnimateTexCoords(button.ants, 256, 256, 48, 48, 22, elapsed, 0.01)
local cooldown = button:GetParent().cooldown
-- we need some threshold to avoid dimming the glow during the gdc
-- (using 1500 exactly seems risky, what if casting speed is slowed or something?)
if(cooldown and cooldown:IsShown() and cooldown:GetCooldownDuration() > 3000) then
button:SetAlpha(0.5)
else
button:SetAlpha(1.0)
end
end
overlay:SetScript("OnUpdate", overlay.OnUpdate)
overlay.OnHide = function(button)
if ( button.animOut:IsPlaying() ) then
button.animOut:Stop()
button.animOut:OnFinished()
end
end
overlay:SetScript("OnHide", overlay.OnHide)
local tmpanim
overlay.animIn = overlay:CreateAnimationGroup()
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.spark)
tmpanim:SetDuration(0.2)
tmpanim:SetScale(1.5, 1.5)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.spark)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(0)
tmpanim:SetToAlpha(1)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.innerGlow)
tmpanim:SetDuration(0.3)
tmpanim:SetScale(2, 2)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.innerGlowOver)
tmpanim:SetDuration(0.3)
tmpanim:SetScale(2, 2)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.innerGlowOver)
tmpanim:SetDuration(0.3)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.outerGlow)
tmpanim:SetDuration(0.3)
tmpanim:SetScale(0.5, 0.5)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.outerGlowOver)
tmpanim:SetDuration(0.3)
tmpanim:SetScale(0.5, 0.5)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.outerGlowOver)
tmpanim:SetDuration(0.3)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Scale")
tmpanim:SetTarget(overlay.spark)
tmpanim:SetStartDelay(0.2)
tmpanim:SetDuration(0.2)
tmpanim:SetScale(0.666666, 0.666666)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.spark)
tmpanim:SetStartDelay(0.2)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.innerGlow)
tmpanim:SetStartDelay(0.3)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(1)
tmpanim = overlay.animIn:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.ants)
tmpanim:SetStartDelay(0.3)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(0)
tmpanim:SetToAlpha(1)
tmpanim:SetOrder(1)
overlay.animIn.OnPlay = function(button)
local frame = button:GetParent()
local frameWidth, frameHeight = frame:GetSize()
frame.spark:SetSize(frameWidth, frameHeight)
frame.spark:SetAlpha(0.3)
frame.innerGlow:SetSize(frameWidth / 2, frameHeight / 2)
frame.innerGlow:SetAlpha(1.0)
frame.innerGlowOver:SetAlpha(1.0)
frame.outerGlow:SetSize(frameWidth * 2, frameHeight * 2)
frame.outerGlow:SetAlpha(1.0)
frame.outerGlowOver:SetAlpha(1.0)
frame.ants:SetSize(frameWidth * 0.85, frameHeight * 0.85)
frame.ants:SetAlpha(0)
frame:Show()
end
overlay.animIn:SetScript("OnPlay", overlay.animIn.OnPlay)
overlay.animIn.OnFinished = function(button)
local frame = button:GetParent()
local frameWidth, frameHeight = frame:GetSize()
frame.spark:SetAlpha(0)
frame.innerGlow:SetAlpha(0)
frame.innerGlow:SetSize(frameWidth, frameHeight)
frame.innerGlowOver:SetAlpha(0.0)
frame.outerGlow:SetSize(frameWidth, frameHeight)
frame.outerGlowOver:SetAlpha(0.0)
frame.outerGlowOver:SetSize(frameWidth, frameHeight)
frame.ants:SetAlpha(1.0)
end
overlay.animIn:SetScript("OnFinished", overlay.animIn.OnFinished)
overlay.animOut = overlay:CreateAnimationGroup()
tmpanim = overlay.animOut:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.outerGlowOver)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(0)
tmpanim:SetToAlpha(1)
tmpanim:SetOrder(1)
tmpanim = overlay.animOut:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.ants)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(1)
tmpanim = overlay.animOut:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.outerGlowOver)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(2)
tmpanim = overlay.animOut:CreateAnimation("Alpha")
tmpanim:SetTarget(overlay.outerGlow)
tmpanim:SetDuration(0.2)
tmpanim:SetFromAlpha(1)
tmpanim:SetToAlpha(0)
tmpanim:SetOrder(2)
overlay.animOut.OnFinished = function(button)
local frame = button:GetParent()
frame:Hide()
end
overlay.animOut:SetScript("OnFinished", overlay.animOut.OnFinished)
button.ActionButtonOverlay = overlay
local frameWidth, frameHeight = button:GetSize()
overlay:ClearAllPoints();
overlay:SetSize(frameWidth * 1.4, frameHeight * 1.4)
overlay:SetPoint("TOPLEFT", button, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2);
overlay:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2);
overlay:Hide()
hooksecurefunc("ActionButton_ShowOverlayGlow", function(button)
if not (button.ActionButtonOverlay) then
return
end
if button.ActionButtonOverlay.animOut:IsPlaying() then
button.ActionButtonOverlay.animOut:Stop()
end
if not button.ActionButtonOverlay:IsShown() then
button.ActionButtonOverlay.animIn:Play()
end
end)
hooksecurefunc("ActionButton_HideOverlayGlow", function(button)
if not (button.ActionButtonOverlay) then
return
end
if button.ActionButtonOverlay.animIn:IsPlaying() then
button.ActionButtonOverlay.animIn:Stop()
end
if button:IsVisible() then
button.ActionButtonOverlay.animOut:Play()
else
button.ActionButtonOverlay.animOut:OnFinished()
end
end)
end)
I honestly wish I could just not use masque scaling and avoid the issue entirely, but I want to be able to read my keybinds still.
You could just use the custom add-on you're using to change the text size. Eg:
for i = 1, 12 do
-- Default FontObject is "NumberFontNormalSmallGray, with a size of 11.
_G["ActionButton"..i].HotKey:SetFontObject("NumberFontNormalGray") -- Size = 14
end
or if you need to be more precise:
local path, size, flags = ActionButton1.HotKey:GetFont()
for i = 1, 12 do
_G["ActionButton"..i].HotKey:SetFont(path, 13, flags)
end
That was just an example. You'd need to iterate through all the bars and their respective buttons:
-- Each of these bars have 12 buttons.
local ActionBars = {
"ActionButton",
"MultiBarBottomLeftButton",
"MultiBarBottomRightButton",
"MultiBarLeftButton",
"MultiBarRightButton",
"MultiBar5Button",
"MultiBar6Button",
"MultiBar7Button",
}
-- Action Bars
for _, name in ipairs(ActionBars) do
for i = 1, 12 do
local btn = _G[name..i]
if btn and btn.HotKey then
btn.HotKey:SetFontObject("NumberFontNormalGray")
end
end
end
-- Pet/Stance Bar
for i = 1, 10 do
local pab, sab = PetActionBar.actionButtons[i], StanceBar.actionButtons[i]
if pab and pab.HotKey then
pab.HotKey:SetFontObject("NumberFontNormalGray")
end
if sab and sab.HotKey then
sab.HotKey:SetFontObject("NumberFontNormalGray")
end
end
Edit: Had to update it a bit, because it's late and I'm tired. This should work, unless I messed something up.
does apply to all action bars now but sadly still does nothing with dominos enabled
A quick search through the code shows only a case of some clean-up for Classic/Wrath, but it doesn't affect Retail. So the issue might be Dominos scaling things, which I can't help you with. The only other thing I can think of is to make sure your custom add-on is loaded after Dominos via the line:
## OptionalDeps: Dominos
In your custom add-on's ToC file(s).
seems to sit 'inside' of the button now, that is to say, the border of the button will overlap the text.
Again, I was just giving you an example. It obviously doesn't account for position. You'll either need to adjust it manually in your custom add-on or, if you're using Masque, you can tweak your local copy of the skin.
There's code in Masque to adjust the position of the text? Well. Doesn't matter if it won't work with dominos anyway.
It should. You'll have to find the HotKey = {
section of your preferred skin and adjust the OffsetX
and OffsetY
values. Note that X is horizontal and Y is vertical and they start in the bottom left corner, so to lower the text, you'd subtract from its current value. To adjust it to the left or right, you subtract or add, respectively, to the X value.
You can use the following to do initialization to stock action buttons/addons that reuse the stock templates. ActionBarActionButtonMixin:OnLoad
calls ActionBarButtonEventsFrame:RegisterFrame
local function onRegister(button)
-- do stuff like restyling buttons
button.HotKey:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
end
-- deal with buttons that have already been loaded
for _, button in ipairs(ActionBarButtonEventsFrame.frames) do
onRegister(button)
end
-- handle buttons that are loaded later
hooksecurefunc(ActionBarButtonEventsFrame, "RegisterFrame", function(_, button)
onRegister(button)
end)
@StormFX hey. bit unrelated, but im trying to get my hotkey font the same as it was pre shadowlands. I am using the exact same font+flags (NumberFontNormalSmallGray with the thickoutline and monochrome flags) but its not quite the same, left is Legion, right is Dragonflight. Legion had more spacing between the letters it seems, could it be a shadow thingy? https://i.imgur.com/3xMVjcB.png
The text on the right is larger. When text is scaled, the spacing, etc, changes and can look off. This happens even with desktop applications. You can try setting its size to a decimal. Eg, if you've changed it from 11px to 12px, try setting it 11.5 or something.
Edit: It also could be partially related to UI scaling. You'd have to fiddle around with it and see what affects it.