动画圆的宽度时如何获得平滑的子像素动画?

时间:2014-10-20 14:39:59

标签: delphi delphi-xe2 firemonkey

当我为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

1 个答案:

答案 0 :(得分:5)

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

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

更改

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

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

因此,摆脱Round

Haven已经足够测试以发现副作用。