- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 CADisplayLink
制作 View 动画,它只是插入一个值并重绘 View 本身。
例如我有一个 View MyView
并且它有一个属性 value
,每当设置值时我调用 setNeedsDisplay
并且 View 知道要绘制什么。
为此设置动画,我使用 CADisplayLink
并且我希望 View 在值之间“变形”。我通过插入动画开始和停止值的值来做到这一点:
- (CGFloat)interpolatedValue:(CGFloat)sourceValue withValue:(CGFloat)targetValue forProgress:(CGFloat)progress;
现在获得线性进展很容易并获得“特定曲线”(好的)但我希望能够利用 CAMediaTimingFunction
来做到这一点(或其他一些预先存在的逻辑 - 我不'想重新发明轮子' :)
最佳答案
有这个很棒的要点 RSTiming
这对你来说可能很方便。您可以使用标准 CAMediaTimingFunction 定义计时函数,甚至可以使用 2 个控制点定义贝塞尔曲线来定义自定义函数。
如果我得到了你的设置,你可能会有这样的东西:
View Controller
#import "ViewController.h"
#import "AnimatedView.h"
#include <stdlib.h>
@interface ViewController ()
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (weak, nonatomic) IBOutlet AnimatedView *viewToAnimate;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateFrame)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)updateFrame {
[self.viewToAnimate updateAnimation];
}
- (IBAction)updateAnimationTapped:(id)sender {
self.viewToAnimate.value = arc4random_uniform(101) / 100.0;
NSLog(@"Next animation value: %f", self.viewToAnimate.value);
}
@end
动画 View
#import "AnimatedView.h"
#import "RSTimingFunction.h"
@interface AnimatedView()
{
CGFloat _lastValue;
CGFloat _progressStep;
CGFloat _currentProgress;
}
@property (nonatomic, strong) RSTimingFunction *animationProgress;
@end
@implementation AnimatedView
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if ((self = [super initWithCoder:aDecoder]))
{
_progressStep = 0.01; // defines animation speed
_currentProgress = 1.0;
self.animationProgress = [RSTimingFunction timingFunctionWithName:kRSTimingFunctionEaseInEaseOut];
}
return self;
}
- (void)setValue:(CGFloat)value {
if (_value != value)
{
_lastValue = _value;
_value = value;
_currentProgress = 0.0;
}
}
- (void)updateAnimation
{
if (_currentProgress > 1.0)
return;
_currentProgress += _progressStep;
CGFloat currentAnimationValue = _lastValue + (_value - _lastValue) * [self.animationProgress valueForX:_currentProgress];
self.alpha = currentAnimationValue; // as an example animate alpha
}
@end
如前所述,您甚至可以设置 2 个控制点来创建以三次贝塞尔曲线为模型的计时函数。
self.animationProgress = [RSTimingFunction timingFunctionWithControlPoint1:CGPointMake(0.6, 0.6) controlPoint2:CGPointMake(0.1, 0.8)];
这将产生以下计时动画(使用 CAMediaTimingFunction playground 产生)
关于ios - 使用带有 CAMediaTimingFunction 的 CADisplayLink 'combined' 为 UIView 设置动画。 (获得任意曲线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29938707/
我有一个 UIView,我想在 10 秒内将不透明度设置为 0。但是,动画应在 7.5 秒后开始。这是因为我首先对帧更改进行动画处理,并且 UIView 应该仅在动画的最后 1/4 持续时间中淡出。这
CGFloat start = 0; // The start value of X for an animation CGFloat distance = 100; // The dist
我想使用 CAMediaTimingFunction(例如 kCAMediaTimingFunctionEaseIn)将输入值 (0-1) 映射到输出值 (0-1),就像 the docs说这门课。但
我有一个 tableview 和另一个 View ,我想为另一个 View 设置动画,以便它在滚动时像 tableview 一样减速并同时停止和动画曲线。所以,我认为我可以实现 - (void)scr
在 Cocoa/Touch 中,CAMediaTimingFunction 表示四个控制点,用于指定计时函数的三次贝塞尔曲线。对于我正在编写的应用程序,我希望能够在任意时间 t (0 -> 1) 提取
任何人都可以建议替代这行代码,以便我的代码与 ARC 兼容。 [animation setTimingFunction:(CAMediaTimingFunction*)UIViewAnimationC
UIViewAnimationCurve只有 UIViewAnimationCurveEaseInOut UIViewAnimationCurveEaseIn UIViewAnimationCurve
我正在尝试为一些 NSView 的 alpha 过渡设置动画。它需要在另一个动画期间发生,特别是它的 super View (边界更改)。解释原因有点复杂,但我需要这些 alpha 转换具有计时功能,
View Programming Guide for iOS告诉我们基于 block 的动画是前进的方向,而不是现在几乎被弃用的 begin/commit 风格的动画: Note: If you ar
我用这个在OC中使用这个函数 CAMediaTimingFunction *function = [CAMediaTimingFunction functionWithName:
我正在使用 CADisplayLink 制作 View 动画,它只是插入一个值并重绘 View 本身。 例如我有一个 View MyView 并且它有一个属性 value,每当设置值时我调用 setN
我是一名优秀的程序员,十分优秀!