CAnimation-模拟时钟

效果图



实现思路


  • 该示例通过隐式动画实现
  • 表盘通过显示在imageView中的一张图片来实现
  • 在表盘上绘制(时分秒)三条直线,分别位于不同的图层,且时针位于最下层,秒针位于最上层
    • 设置直线为圆角
    • 直线的一段位于表盘的圆心
    • 通过NSTimer定时器,使不同的图层定时执行对应的动画

实现步骤


  • 通过storyboard创建表盘,并拥有它

    @property (weak, nonatomic) IBOutlet UIImageView *clockView;
  • 使用三个成员变量来保存时分秒三根表针位于的不同图层
    @property (nonatomic, weak) CALayer *secondLayer;
    @property (nonatomic, weak) CALayer *minuteLayer;
    @property (nonatomic, weak) CALayer *hourLayer;
  • 初始化所用到的常量
    //将旋转角度转换为弧度制
    #define angleToRadion(angle) ((angle) / 180.0 * M_PI)
    
    //秒针每秒钟转过的角度
    #define perSecondAngle 6
    //分针每分钟转过的角度
    #define perMinuteAngle 6
    //时针每小时转过的角度
    #define perHourAngle 30
    //时针每分钟转过的角度
    #define perMuniteHourAngle 0.5
  • 设置时分秒三根表针
    • 设置时针

      - (void)setUpHourLayer
      {
      	//创建图层
      	CALayer *layer = [CALayer layer];
      	layer.backgroundColor = [UIColor blackColor].CGColor;
      	layer.cornerRadius = 8;
      
      	设置图层的锚点
      	layer.anchorPoint = CGPointMake(0.5, 1);
      	//设置图层的位置和尺寸
      	layer.position = CGPointMake(kClockWith * 0.5, kClockWith * 0.5);
      	layer.bounds = CGRectMake(0, 0, 5, kClockWith * 0.5 - 44);
      
      	//将图层添加到父图层中
      	[self.clockView.layer addSublayer:layer];
      	self.hourLayer = layer;
      }
    • 设置分针
      - (void)setUpMinuteLayer
      {
          CALayer *layer = [CALayer layer];
          layer.backgroundColor = [UIColor blackColor].CGColor;
          layer.cornerRadius = 4;
      
          //设置锚点
          layer.anchorPoint = CGPointMake(0.5, 1);
      
          //设置位置和尺寸
          layer.position = CGPointMake(kClockWith * 0.5, kClockWith * 0.5);
          layer.bounds = CGRectMake(0, 0, 3, kClockWith * 0.5 - 34);
      
          //将图层添加到父图层中
          [self.clockView.layer addSublayer:layer];
          self.minuteLayer = layer;
      }
    • 设置秒针
      - (void)setUpSecondLayer
      {
          CALayer *layer = [CALayer layer];
          layer.backgroundColor = [UIColor redColor].CGColor;
      
          //设置锚点
          layer.anchorPoint = CGPointMake(0.5, 1);
      
          //设置位置和尺寸
          layer.position = CGPointMake(kClockWith * 0.5, kClockWith * 0.5);
          layer.bounds = CGRectMake(0, 0, 1, kClockWith * 0.5 - 24);
      
          //将图层添加到父图层中
          [self.clockView.layer addSublayer:layer];
          self.secondLayer = layer;
      }
  • 设置定时器,定时执行动画
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  • 设置定时器触发时调用的方式,添加动画代码
    - (void)timeChange
    {
        //获取日历对象
        NSCalendar *calendar = [NSCalendar currentCalendar];
    
        //获取日期组件
        NSDateComponents *components = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
    
        //获取当前的时分秒值
        NSInteger second = components.second;
        NSInteger munite = components.minute;
        NSInteger hour = components.hour;
    
        //计算当前时分秒表针转过的角度(弧度制)
        CGFloat secondAngle = angleToRadion(second * perSecondAngle);
        CGFloat muniteAngle = angleToRadion(munite * perMinuteAngle);
        CGFloat hourAngle = angleToRadion(hour *perHourAngle + munite * perMuniteHourAngle);
    
        //修改时分秒表针位于的图层的transform属性,执行隐式动画
        self.secondLayer.transform = CATransform3DMakeRotation(secondAngle, 0, 0, 1);
        self.minuteLayer.transform = CATransform3DMakeRotation(muniteAngle, 0, 0, 1);
        self.hourLayer.transform = CATransform3DMakeRotation(hourAngle, 0, 0, 1);
    }
时间: 2024-12-04 13:28:46

CAnimation-模拟时钟的相关文章

模拟时钟

1 #include <Windows.h> 2 #include <tchar.h> 3 #include <math.h> 4 typedef struct Time 5 { 6 int hour, min, sec; 7 }TimeStructure; 8 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow); 9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM

JS模拟时钟

<html> <head> <title>js模拟时钟</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body onLoad="setInterval(setTimeSpan,1000);"> <span style="fon

模拟时钟(AnalogClock)和数字时钟(DigitalClock)

Demo2\clock_demo\src\main\res\layout\activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 and

WPF模拟时钟制作

近日因为项目需求,所以才花了一个晚上的时间来学习和制作WPF模拟时钟.本想着参考网上的WPF模拟时钟控件,但多数过于简单.也有一些模拟时钟确实制作的非常精美,但使用了GDI+技术,而非我需要的WPF时钟控件.好了,下面给出我制作的WPF模拟时钟的运行截图吧: 色彩方面只是用了黑色,白色,蓝色等鲜明的颜色,看起来没有特别绚丽,当然,如果需要,可以设置成需要的绚丽的颜色等. 以下是该模拟时钟的XAML代码部分: 1 <Window x:Class="AnalogClockProject.Mai

纯js+html+css实现模拟时钟

前几天没事写的个模拟时钟,代码仅供小白参考,大神请自动绕过. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>模拟时钟</title> 6 <style> 7 body { 8 margin: 0; 9 padding: 0; 10 } 11 12 #blockDial {

模拟时钟(AnalogClock)

显示一个带时钟和分针的表面 会随着时间的推移变化 常用属性: android:dial 可以为表面提供一个自定义的图片 下面我们直接看代码: 1.Activity //模拟时钟 public class AnalogClockActivity extends Activity { private TextView timeTextView; private Handler handler; protected void onCreate(Bundle savedInstanceState) {

WinForm学习 --简单的模拟时钟程序

今天学习GDI+,试着想写一个模拟时钟的小程序,原以为很简单实现:但其实还有些复杂,特别是利用三角函数的那部分,让我四处找资料恶补了一下高中数学才算弄清楚,现在就回顾一下这个程序吧. 程序的目的是要模拟出时钟的效果,那首先就是要画出这个时钟的样子.不考虑美观,一个时钟最简单的组成是一个圆形的表盘,三根直线代表的时针.分针和秒针. <img缺失> 看起来很简单吧,但要怎么样画呢?让我们一步一步来吧: 1.画表盘 Graphics g = this.CreateGraphics(); //创建一个

使用ivx制作模拟时钟的经验总结

之前的帖子里已经使用时间轴和轨迹实现了很多的效果,今天我们来做一个模拟时钟.主要思路是用一个作为表盘,三个矩形分别作为时针,分针和秒针,通过各自轨迹设置他们在同一时间轴下的转动圈数成一定比例关系. 1.表盘首先是添加椭圆组件,这里我们需要设置它的原点横纵坐标都是50%,这样椭圆组件的XY坐标就是它的中心店坐标,这个XY坐标在我们设置指针的时候也要用到.2.添加指针指针使用矩形来展示的,由于指针要绕着表盘的中心点旋转,所以我们要将矩形的坐标原点与椭圆的坐标原点设置在同一个位置.因此先设置矩形的原点

WIN32下的模拟时钟

#include <Windows.h> #include <math.h> #include <tchar.h> #include "resource.h" #define PI 3.1415926 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI W

Qt之模拟时钟

简述 Qt自带的示例中有一个是关于时钟,演示了如何用QPainter的转换和缩放特性来简化绘制自定义部件. 其中主要包含了时针.分针的绘制,并不包含秒针.下面,我们在原示例的基础上进行扩展. 简述 实现方式 示例 效果 源码 更多参考 实现方式 由于时钟是妙级更新的,所以我们需要定时刷新,时钟则使用之前讲过的QPainter 2D图形来进行绘制. 使用QTimer定时刷新,设置超时时间为1000毫秒(1秒). 绘制时钟,通过paintEvent()实现,包括:时针.分针.秒针.及面板.表盘等.