CABasicAnimation的使用方法(移动,旋转,缩放)

设定动画CABasicAnimation的属性和说明
属性说明
duration动画的时间
repeatCount重复的次数。不停重复设置为 HUGE_VALF
repeatDuration设置动画的时间。
beginTime指定动画开始的时间。从开始延迟几秒的话,设置为【CACurrentMediaTime() + 秒数】 的方式
timingFunction设置动画的速度变化
autoreverses动画结束时是否执行逆动画
fromValue所改变属性的起始值
toValue所改变属性的结束时的值
byValue所改变属性相同起始值的改变量


动画结束后停在最后位置状态的解决方法

用CABasicAnimation执行动画,在动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性

animation.removedOnCompletion = NO

animation.fillMode = kCAFillModeForwards; 


1.移动动画

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
animation.duration = 2;
animation.repeatCount = 2;

animation.beginTime =CACurrentMediaTime() + 1;// 1秒后执行

animation.fromValue = [NSValue valueWithCGPoint:myView.layer.position]; // 起始帧 

animation.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 300)]; // 终了帧

// 视图添加动画 

[View.layer addAnimation:animation forKey:@"move-layer"]; 

2.旋转动画

// 对Y轴进行旋转(指定Z轴的话,就和UIView的动画一样绕中心旋转) 
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];

animation.duration = 2;

animation.repeatCount = 2;

animation.beginTime = CACurrentMediaTime() + 1// 1秒后执行

animation.fromValue = [NSNumber numberWithFloat:0.0]; // 起始角度

animation.toValue = [NSNumber numberWithFloat:M_PI]; // 终止角度 

[View.layer addAnimation:animation forKey:@"rotate-layer"];

3.缩放动画

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
animation.duration = 2.5// 动画持续时间 
animation.repeatCount = 1// 重复次数 
animation.fromValue = [NSNumber numberWithFloat:1.0]; // 开始时的倍率  
animation.toValue = [NSNumber numberWithFloat:2.0]; // 结束时的倍率 

[myView.layer addAnimation:animation forKey:@"scale-layer"]; 

4.渐隐动画

    //opacity layer的透明度

    CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];

    basicAnimation.fromValue = @(1.0);

    basicAnimation.toValue  = @(0.0);//[NSNumber numberWithFloat:0.0]

    basicAnimation.duration = 1.5;

    [self.myView.layer addAnimation:basicAnimation forKey:@"op"];


5.组合动画

CABasicAnimation *animation1 =[CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
animation1.toValue = [NSNumber numberWithFloat:80];; // 終点 
CABasicAnimation *animation1 =[CABasicAnimation animationWithKeyPath:@"transform.translation.z"];
animation2.fromValue = [NSNumber numberWithFloat:0.0]; // 开始时的角度
animation2.toValue = [NSNumber numberWithFloat:M_PI]; // 结束时的角度


/* 动画组 */ 
CAAnimationGroup *group = [CAAnimationGroup animation]; 
group.duration = 1.0;  
group.repeatCount = 1;

group.animations = [NSArray arrayWithObjects:animation1, animation2, nil nil];  
[myView.layer addAnimation:group forKey:@"move-rotate-layer"]; 

6.捕获动画开始时和终了时的事件

- (void)animationDidStart:(CAAnimation *)theAnimation {

 }

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {


 }


参考博客:http://blog.csdn.net/iosevanhuang/article/details/14488239
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用QOpenGLWidget来显示OpenGL渲染的3D模型,同时可以使用QMatrix4x4来实现旋转缩放移动操作。以下是一个简单的示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidget from PyQt5.QtGui import QMatrix4x4, QVector3D from PyQt5.QtCore import Qt import sys class OpenGLWidget(QOpenGLWidget): def __init__(self, parent=None): super().__init__(parent) self.obj_model = None self.rotation = QMatrix4x4() self.scale = QMatrix4x4() self.translation = QMatrix4x4() def initializeGL(self): # 初始化OpenGL环境 pass def paintGL(self): # 渲染3D模型 pass def resizeGL(self, width, height): # 处理窗口大小变化 pass def mousePressEvent(self, event): # 处理鼠标按下事件 pass def mouseMoveEvent(self, event): # 处理鼠标移动事件 pass def wheelEvent(self, event): # 处理鼠标滚轮事件 pass if __name__ == '__main__': app = QApplication(sys.argv) window = QMainWindow() gl_widget = OpenGLWidget() window.setCentralWidget(gl_widget) window.show() sys.exit(app.exec_()) ``` 在这个示例代码中,我们创建了一个继承自QOpenGLWidget的OpenGLWidget类,用于显示3D模型。在初始化函数中,我们可以加载obj模型文件,并初始化旋转缩放移动矩阵。在paintGL函数中,我们可以使用OpenGL渲染3D模型,并应用旋转缩放移动矩阵。在鼠标事件和滚轮事件中,我们可以根据用户的操作来更新旋转缩放移动矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值