Xamarin.Forms iOS 使用图像创建动画
Xamarin.Forms iOS Create animation using images
我从事 Xamarin.Fomrs
共享项目。我想以 100 毫秒的间隔在同一个地方显示多个图像。这样它看起来就像一个 GIF。在 Android 它正在工作。我创建了可绘制文件,并在其中放置了所有具有时间间隔的图像。但是在iOS,我遇到了问题。
我发现CAKeyFrameAnimation
就是用来实现这类功能的。但是我找不到我想要的实现方法。
我已经在 ImageRenderer
中实现了 CAKeyFrameAnimation
这样的
class AnimatedImageRenderer : ImageRenderer
{
public AnimatedImageRenderer() { }
Animation objAnimation = new Animation();
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
if (Control != null)
{
try
{
CAKeyFrameAnimation anim = CAKeyFrameAnimation.FromKeyPath("contents");
anim.Duration = 1;
//anim.KeyTimes = new[] {
// NSNumber.FromDouble (0), // FIRST VALUE MUST BE 0
// NSNumber.FromDouble (0.1),
// NSNumber.FromDouble(0.2),
// NSNumber.FromDouble(0.3),
// NSNumber.FromDouble(0.5),
// NSNumber.FromDouble(0.6),
// NSNumber.FromDouble(0.8),
// NSNumber.FromDouble(1.0), // LAST VALUE MUST BE 1
// };
anim.Values = new NSObject[] {
FromObject(UIImage.FromFile("bomb1.png")),
FromObject(UIImage.FromFile("bomb2.png")),
FromObject(UIImage.FromFile("bomb3.png")),
FromObject(UIImage.FromFile("bomb4.png")),
FromObject(UIImage.FromFile("bomb5.png")),
FromObject(UIImage.FromFile("bomb6.png")),
FromObject(UIImage.FromFile("bomb7.png")),
};
//anim.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
anim.RepeatCount = 1;
anim.RemovedOnCompletion = false;
//anim.CalculationMode = CAAnimation.AnimationLinear;
//c.Init();
Control.Layer.AddAnimation(anim, "bomb");
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
// ModCommon.TraceLog("AnimatedImageRenderer tm_Tick" + ex.Message);
}
}
}
}
我不知道缺少什么 属性。请指导我。
谢谢:)
您应该使用 CGImage 而不是 UIImage。将动画值更改为:
anim.Values = new NSObject[] {
FromObject(UIImage.FromFile("bomb1.png").CGImage),
FromObject(UIImage.FromFile("bomb2.png").CGImage),
FromObject(UIImage.FromFile("bomb3.png").CGImage),
FromObject(UIImage.FromFile("bomb4.png").CGImage),
FromObject(UIImage.FromFile("bomb5.png").CGImage),
FromObject(UIImage.FromFile("bomb6.png").CGImage),
FromObject(UIImage.FromFile("bomb7.png").CGImage),
};
我从事 Xamarin.Fomrs
共享项目。我想以 100 毫秒的间隔在同一个地方显示多个图像。这样它看起来就像一个 GIF。在 Android 它正在工作。我创建了可绘制文件,并在其中放置了所有具有时间间隔的图像。但是在iOS,我遇到了问题。
我发现CAKeyFrameAnimation
就是用来实现这类功能的。但是我找不到我想要的实现方法。
我已经在 ImageRenderer
中实现了 CAKeyFrameAnimation
这样的
class AnimatedImageRenderer : ImageRenderer
{
public AnimatedImageRenderer() { }
Animation objAnimation = new Animation();
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
if (Control != null)
{
try
{
CAKeyFrameAnimation anim = CAKeyFrameAnimation.FromKeyPath("contents");
anim.Duration = 1;
//anim.KeyTimes = new[] {
// NSNumber.FromDouble (0), // FIRST VALUE MUST BE 0
// NSNumber.FromDouble (0.1),
// NSNumber.FromDouble(0.2),
// NSNumber.FromDouble(0.3),
// NSNumber.FromDouble(0.5),
// NSNumber.FromDouble(0.6),
// NSNumber.FromDouble(0.8),
// NSNumber.FromDouble(1.0), // LAST VALUE MUST BE 1
// };
anim.Values = new NSObject[] {
FromObject(UIImage.FromFile("bomb1.png")),
FromObject(UIImage.FromFile("bomb2.png")),
FromObject(UIImage.FromFile("bomb3.png")),
FromObject(UIImage.FromFile("bomb4.png")),
FromObject(UIImage.FromFile("bomb5.png")),
FromObject(UIImage.FromFile("bomb6.png")),
FromObject(UIImage.FromFile("bomb7.png")),
};
//anim.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
anim.RepeatCount = 1;
anim.RemovedOnCompletion = false;
//anim.CalculationMode = CAAnimation.AnimationLinear;
//c.Init();
Control.Layer.AddAnimation(anim, "bomb");
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
// ModCommon.TraceLog("AnimatedImageRenderer tm_Tick" + ex.Message);
}
}
}
}
我不知道缺少什么 属性。请指导我。
谢谢:)
您应该使用 CGImage 而不是 UIImage。将动画值更改为:
anim.Values = new NSObject[] {
FromObject(UIImage.FromFile("bomb1.png").CGImage),
FromObject(UIImage.FromFile("bomb2.png").CGImage),
FromObject(UIImage.FromFile("bomb3.png").CGImage),
FromObject(UIImage.FromFile("bomb4.png").CGImage),
FromObject(UIImage.FromFile("bomb5.png").CGImage),
FromObject(UIImage.FromFile("bomb6.png").CGImage),
FromObject(UIImage.FromFile("bomb7.png").CGImage),
};