亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS動畫案例(1) 類似于qq賬號信息里的一個動畫效果

2020-07-26 02:57:36
字體:
來源:轉載
供稿:網友

受人所托,做一個類似于qq賬號信息里的一個動畫,感覺挺有意思,也沒感覺有多難,就開始做了,結果才發現學的數學知識都還給體育老師了,研究了大半天才做出來。

 先看一下動畫效果:

用到的知識點:

(1)三角函數
(2)CALayer
(3)CATransaction
(4)UIBezierPath
(5)CAKeyframeAnimation
(6)CAAnimationGroup

 如圖,這明顯是一段圓弧,那么要確定這段一段圓弧的位置,就得確定這段圓弧的圓心和圓心角。我規定圓心在手機屏幕的左頂點,也就是(0,0),圓心角為60°。別問我為什么這么確定,我也是一點點嘗試的。我們先設手機屏幕的寬度為 ScreenWidth,圓弧半徑為R;那么R = ScreenWidth/cos(60°);知道了這些開始畫圓弧。

// 屏幕的寬度 CGFloat width = [UIScreen mainScreen].bounds.size.width; // 圓半徑  float r = 2 * width / sqrt(3); // 畫曲線 UIColor *color = [UIColor redColor]; [color set]; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:r startAngle:M_PI / 2 endAngle:M_PI / 6 clockwise:NO]; path.lineWidth = 1.0; path.lineCapStyle = kCGLineCapRound; path.lineJoinStyle = kCGLineJoinRound; [path stroke];

 確定了圓心角和半徑就要確定ABCD四個點的坐標了,分別作為四張圖片的圓心。圓弧SA和圓弧DE的圓心角一樣,設定為7.5°,那么弧AB、弧BC、弧CD的圓心角設定為相等,分別為(60 - 7.5 * 2)/ 3 = 15°。那么A點的坐標就等于(R * sin7.5,R * cos7.5°);B,C,D點的坐標一樣用三角函數求,分別為(R * sin22.5,R * cos22.5°),(R * sin37.5,R * cos37.5°),(R * sin52.5,R * cos52.5°)。ABCD其實都是一個按鈕,下面開始放按鈕。

// 放圖片 for (int i = 0; i < 4; i++) {  // 一共四個按鈕 從左到右index分別為0,1,2,3  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];  button.frame = [self getButtonFrame:i];  button.tag = i + 1;  [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];  [button setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d",i + 1]] forState:UIControlStateNormal];  // 設置按鈕為圓  button.layer.cornerRadius = 25;  button.layer.borderColor = [UIColor greenColor].CGColor;  button.layer.masksToBounds = YES;  button.layer.borderWidth = 2.0f;  [self addSubview:button]; } // 根據Index確定按鈕的坐標 - (CGRect)getButtonFrame: (int) index { float radians = M_PI * (7.5 + 15 * index) / 180; CGFloat width = [UIScreen mainScreen].bounds.size.width; float r = 2 * width / sqrt(3); CGRect frame = CGRectMake(sin(radians) * r, cos(radians) * r, 50, 50); frame.origin.x = frame.origin.x - 25; frame.origin.y = frame.origin.y - 25; return frame; }

 頭像默認放第一個。

 self.head = [[UIImageView alloc] initWithFrame:[self getButtonFrame:0]]; self.head.image = [UIImage imageNamed:@"myHead"]; self.head.layer.borderColor = [UIColor greenColor].CGColor; self.head.layer.masksToBounds = YES; self.head.layer.cornerRadius = 25; self.head.layer.borderWidth = 2.0f; [self addSubview:self.head];

之后按鈕點擊之后,頭像移動到按鈕點擊的地方。

// 按鈕點擊事件- (void)buttonClick:(UIButton *)button { // 原來圖片所在按鈕的index int preIndex = [self getPreviousIndexByFrame:self.head.frame]; int buttonIndex = (int)button.tag - 1; // 點擊圖片所在按鈕 不做任何操作 if (preIndex == buttonIndex) {  return; } CGFloat width = [UIScreen mainScreen].bounds.size.width; float r = 2 * width / sqrt(3); //加入動畫效果 CALayer *transitionLayer = [[CALayer alloc] init]; //顯式事務默認開啟動畫效果,kCFBooleanTrue關閉 保證begin和commit 之間的屬性修改同時進行 transitionLayer.contents = self.head.layer.contents; transitionLayer.borderColor = [UIColor greenColor].CGColor; transitionLayer.masksToBounds = YES; transitionLayer.cornerRadius = 25; transitionLayer.borderWidth = 2.0f; transitionLayer.frame = self.head.frame; transitionLayer.backgroundColor=[UIColor blueColor].CGColor; [self.layer addSublayer:transitionLayer]; self.head.hidden = YES; UIBezierPath *movePath; //路徑曲線 貝塞爾曲線 if (buttonIndex > preIndex) {  // 向上滑 逆時針  movePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:r startAngle:[self getAnticlockwiseByIndex:preIndex] endAngle:[self getAnticlockwiseByIndex:buttonIndex] clockwise:NO];  [movePath moveToPoint:transitionLayer.position]; }else {  // 向下滑 順時針  movePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:r startAngle:[self getClockwiseAngleByIndex:preIndex] endAngle:[self getClockwiseAngleByIndex:buttonIndex] clockwise:YES];  [movePath moveToPoint:transitionLayer.position]; } //關鍵幀動畫效果 CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; // 動畫軌跡 positionAnimation.path = movePath.CGPath; // 動畫完成之后是否刪除動畫效果 positionAnimation.removedOnCompletion = NO; // 設置開始的時間 positionAnimation.beginTime = CACurrentMediaTime(); CGFloat time = 0.7; if (labs(buttonIndex - preIndex) > 1) {  time = 0.4 * labs(buttonIndex - preIndex); } //動畫總時間 positionAnimation.duration = time; // 動畫的方式 淡入淡出 positionAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; // 執行完之后保存最新的狀態 positionAnimation.fillMode = kCAFillModeForwards; // 動畫完成之后,是否回到原來的地方 positionAnimation.autoreverses= NO; [transitionLayer addAnimation:positionAnimation forKey:@"opacity"]; [CATransaction setCompletionBlock:^{  [NSThread sleepForTimeInterval:time];  self.head.hidden = NO;  self.head.frame = button.frame;  [transitionLayer removeFromSuperlayer]; }];}// 根據Index獲得順時針的弧度- (float)getAnticlockwiseByIndex: (NSInteger)index { return M_PI * (0.5 - (7.5 + 15 * index) / 180);}// 根據Index獲得逆時針的弧度- (float)getClockwiseAngleByIndex: (NSInteger)index { index = 3 - index; return M_PI * (30 + 7.5 + 15 * index) / 180;}

 這個動畫的難點其實是確定四個按鈕的坐標以及圓弧的半徑,主要是學的數學都忘的差不多了,還好重新撿起來還算不難。

以上所述是小編給大家介紹的iOS動畫案例(1) 類似于qq賬號信息里的一個動畫效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美第一页在线| 欧美电影免费看| 日韩有码在线观看| 欧美与欧洲交xxxx免费观看| 一区国产精品视频| 精品国产一区二区在线| 精品视频久久久久久| 国产午夜精品视频免费不卡69堂| 亚洲香蕉av在线一区二区三区| 亚洲欧美一区二区三区久久| 91精品视频在线播放| 国产精品美女久久| 亚洲欧美日韩精品久久| 欧美插天视频在线播放| 亚洲综合中文字幕在线观看| 视频在线观看一区二区| 久久成人综合视频| 久久夜精品va视频免费观看| 亚洲精品日韩av| 欧美日韩激情网| 国产mv免费观看入口亚洲| 国产精品久久久久免费a∨大胸| 影音先锋欧美在线资源| 久久91亚洲精品中文字幕奶水| 欧美午夜视频在线观看| 日韩中文字幕国产精品| 亚洲天堂精品在线| 78色国产精品| 尤物yw午夜国产精品视频明星| 中文字幕亚洲一区二区三区五十路| 国产精品中文字幕在线| 国产精品自拍网| 日韩亚洲欧美中文高清在线| 最新国产精品拍自在线播放| 国产在线高清精品| 国产三级精品网站| 欧美性69xxxx肥| 亚洲精品美女网站| 欧美性xxxx在线播放| 亚洲国产天堂网精品网站| 亚洲一二在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 2019中文字幕在线| 夜夜嗨av一区二区三区四区| 最新日韩中文字幕| 国产精品对白刺激| 一本色道久久88亚洲综合88| 国产激情久久久久| 亚洲国产精品小视频| 亚洲在线观看视频| 欧美午夜性色大片在线观看| 国产91成人在在线播放| 国产一区二区三区日韩欧美| 欧美另类老肥妇| 91亚洲精品一区二区| 色无极影院亚洲| 欧美日韩亚洲一区二区| 国产精品久久久久久久天堂| 色综合久久88色综合天天看泰| 日韩av在线一区| 中文字幕亚洲一区在线观看| 97视频人免费观看| 久久国内精品一国内精品| 国产成人高潮免费观看精品| 国产精品永久免费| 亚洲精品国产精品久久清纯直播| 国产精品偷伦一区二区| 亚洲国产天堂久久综合网| 中文字幕免费国产精品| 国产精品福利无圣光在线一区| 欧美另类99xxxxx| 亚洲男人第一av网站| 97超碰蝌蚪网人人做人人爽| 亚洲精品美女久久| 精品视频一区在线视频| 青青草国产精品一区二区| 国产一区二区三区18| 日本老师69xxx| 日韩成人激情影院| 中文字幕在线观看亚洲| 成人国产精品一区| 欧美不卡视频一区发布| 91国自产精品中文字幕亚洲| 亚洲欧洲国产精品| 岛国视频午夜一区免费在线观看| 亚洲精品女av网站| 黑人狂躁日本妞一区二区三区| 亚洲欧美一区二区三区四区| 成人黄色生活片| 97在线观看视频国产| 国产日韩精品视频| 秋霞成人午夜鲁丝一区二区三区| 欧美性猛交xxxx乱大交极品| 国产在线观看精品| 69久久夜色精品国产69| 欧美肥臀大乳一区二区免费视频| 亚洲精品永久免费精品| 欧美大片va欧美在线播放| 日本aⅴ大伊香蕉精品视频| 国产精品第七影院| 亚洲美女av黄| 国产一区二区三区直播精品电影| 日韩黄色av网站| 色综合天天综合网国产成人网| 欧美又大又硬又粗bbbbb| 精品福利免费观看| 色久欧美在线视频观看| 成人福利在线观看| 91精品视频在线免费观看| 欧美视频免费在线观看| 国产成人一区二区在线| 国产丝袜一区视频在线观看| 久久久久久噜噜噜久久久精品| 久久久久久久久久亚洲| 4438全国成人免费| 91av福利视频| 日韩国产精品亚洲а∨天堂免| 国产精品香蕉av| 亚洲品质视频自拍网| 久久精品视频在线观看| 国产精品极品美女粉嫩高清在线| 欧美怡红院视频一区二区三区| 欧美日韩一区二区免费在线观看| 精品久久久久久国产91| 精品久久久久久久久久久久| 国产精品久久9| 精品国产一区av| 亚洲综合最新在线| 全亚洲最色的网站在线观看| 亚洲国产私拍精品国模在线观看| 欧美xxxx做受欧美| 亚洲第一色中文字幕| 亚洲欧美国产视频| 欧美激情亚洲综合一区| 久久久久久久久久亚洲| 91在线视频一区| 日本久久久久亚洲中字幕| 亚洲激情中文字幕| 成人激情电影一区二区| 丝袜美腿亚洲一区二区| 中文字幕亚洲欧美在线| 欧美激情成人在线视频| 久久久久久久久网站| 中文字幕精品一区二区精品| 亚洲精品91美女久久久久久久| 久久久久久综合网天天| 日韩av影视综合网| 日韩欧美精品在线观看| 欧美日本中文字幕| 亚洲欧美制服综合另类| 久久久久久亚洲精品中文字幕| 欧美在线视频网站| 久久久精品国产网站| 久热精品视频在线观看一区| 中文字幕少妇一区二区三区| 国产日韩欧美另类| 欧美亚洲在线观看| 久久理论片午夜琪琪电影网| 91高清免费视频| 国产91亚洲精品| 欧美另类极品videosbest最新版本| 精品国产乱码久久久久酒店| 欧美精品一本久久男人的天堂| 欧美夜福利tv在线|