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

delphi – 在动画TCircle的宽度时如何获得平滑的子像素动画?

发布时间:2020-12-15 09:23:00 所属栏目:大数据 来源:网络整理
导读:当我为TCircle的位置设置动画时,动画是平滑的并且似乎以子像素增量/减量发生.但是,当我为TCircle的宽度(或/和高度)设置动画时,动画以像素为单位递增,使其看起来不那么平滑. 当执行慢动画时,这尤其引人注目,其中位置(X和Y),宽度和高度同时被动画化,从而产生缩
当我为TCircle的位置设置动画时,动画是平滑的并且似乎以子像素增量/减量发生.但是,当我为TCircle的宽度(或/和高度)设置动画时,动画以像素为单位递增,使其看起来不那么平滑.

当执行慢动画时,这尤其引人注目,其中位置(X和Y),宽度和高度同时被动画化,从而产生缩放效果.圆圈的左上部和上部平滑向外,而右侧和底部部分是生涩的.

无法弄清楚为什么会这样.所有建议都非常感谢.

(顺便说一句,当Scale.X和Scale.Y被动画化时不会发生这种情况.平滑.但我不希望笔划粗细缩放,因此使用宽度和高度)

(使用XE2)

一些TForm代码演示:

object Form6: TForm6
  Left = 0
  Top = 0
  Caption = 'Form6'
  ClientHeight = 821
  ClientWidth = 1108
  Visible = False
  StyleLookup = 'backgroundstyle'
  object cirPulse: TCircle
    Position.Point = '(352,192)'
    Width = 200.000000000000000000
    Height = 200.000000000000000000
    Fill.Kind = bkNone
    StrokeThickness = 10.000000000000000000
    object FloatAnimation1: TFloatAnimation
      Enabled = True
      Duration = 50.000000000000000000
      StartFromCurrent = True
      StopValue = 400.000000000000000000
      PropertyName = 'Width'
    end
    object FloatAnimation2: TFloatAnimation
      Enabled = True
      Duration = 50.000000000000000000
      StartFromCurrent = True
      StopValue = 400.000000000000000000
      PropertyName = 'Height'
    end
    object FloatAnimation3: TFloatAnimation
      Enabled = True
      Duration = 50.000000000000000000
      StartFromCurrent = True
      StopValue = 252.000000000000000000
      PropertyName = 'Position.X'
    end
    object FloatAnimation4: TFloatAnimation
      Enabled = True
      Duration = 50.000000000000000000
      StartFromCurrent = True
      StopValue = 92.000000000000000000
      PropertyName = 'Position.Y'
    end
  end
end

解决方法

到目前为止,我似乎已经解决了这个问题,通过更改FMX.Types单元中的以下行,

function FitRect(var R: TRectF; BoundsRect: TRectF): Single;

更改

if ratio < 1 then
begin
  R := RectF(0,RectWidth(R),RectHeight(R));
end
else
begin
  R := RectF(0,round(RectWidth(R) / ratio),round(RectHeight(R) / ratio));
end;

if ratio < 1 then
begin
  R := RectF(0,RectWidth(R) / ratio,RectHeight(R) / ratio);
end;

因此,摆脱回合.

还没有足够的测试来发现副作用.

(编辑:李大同)

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

    推荐文章
      热点阅读