日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

iOS實現點贊動畫特效

瀏覽:10日期:2022-09-17 08:01:58

本文實例為大家分享了iOS實現點贊動畫特效的具體代碼,供大家參考,具體內容如下

動畫的基本使用

動畫的實現基本上是基于對View控件和View的layer屬性進行操作,對視圖進行移動,尺寸變換,透明度變換,旋轉等一系列操作。

關鍵幀動畫:

動畫的實現可以分為兩個部分,一部分是規定動畫的變化內容,比如view需要把scale從0變化到1,這個數字是相對值,即從尺寸為0變化到正常尺寸。另一個部分是規定動畫的漸變時間。這樣就實現了view在規定時間完成指定變化了,這個變化的過程也可以通過參數設置為非均勻變化的。上面的示例是關鍵幀動畫的實現,實現的方式是把動畫劃分為幾個部分,“第一幀”做一件事,“第二幀”再做另外一件事,這就使得變化連續且可控。Duration參數確定了時間,delay確定了延時多久執行,options確定了關鍵幀動畫布局子控件。completion的參數是一個block,其中的內容是在內容執行結束后才調用。這里做了3幀,前兩幀做了尺寸變為3倍然后恢復,后一幀使得其隱藏。結束后會調用block使其移除。

[UIView animateKeyframesWithDuration:self.animationDurtion * 4 delay:0.0 options:UIViewKeyframeAnimationOptionLayoutSubviews animations:^{ /*參數1:關鍵幀開始時間 參數2:關鍵幀占用時間比例 參數3:到達該關鍵幀時的屬性值 */ [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 * self.animationDurtion animations:^{ giveLikeView.transform = CGAffineTransformMakeScale(3, 3);; }]; [UIView addKeyframeWithRelativeStartTime:0.5 * self.animationDurtion relativeDuration:0.5 * self.animationDurtion animations:^{ giveLikeView.transform = CGAffineTransformIdentity; }]; [UIView addKeyframeWithRelativeStartTime:self.animationDurtion relativeDuration:self.animationDurtion * 3 animations:^{ giveLikeView.alpha = 0; }]; } completion:^(BOOL finished) { giveLikeView.hidden = YES; [giveLikeView removeFromSuperview]; }];

CAShapeLayer和UIBezierPath:

當不滿足于view的變化,還需要在view的表面繪制一些圖案,就要對layer進行操作,layer可以理解為是view的表面,每個view都有layer參數。UIBezierPath是貝塞爾曲線,它用于設置繪圖的路徑,沒有了它,layer的繪制也是無效的,因為沒有邊界呀。如下代碼繪制了一個圓形的曲線,設置了它的中心,半徑,起始終止角這些屬性。

UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(giveLikeView.bounds.size.width/2, giveLikeView.bounds.size.height/2) radius:giveLikeView.bounds.size.width startAngle:-1.57 endAngle:-1.57+3.14*2 clockwise:YES]; circleLayer.path = bezierPath.CGPath; [self.layer addSublayer:circleLayer];

在最后我們可以看到:circleLayer.path = bezierPath.CGPath; [self.layer addSublayer:circleLayer];它的作用是設置layer的路徑,并把layer添加到view的表面。下面來看看layer的配置。創建一個layer后設置它的frame和顏色以及邊界,線寬這些屬性。

CAShapeLayer *circleLayer = [[CAShapeLayer alloc] init];circleLayer.frame = giveLikeView.frame;circleLayer.fillColor = [UIColor clearColor].CGColor;circleLayer.strokeColor = [UIColor redColor].CGColor;circleLayer.lineWidth = 1;

幾處聯系:把貝塞爾曲線和layer聯系起來,把layer和view的layer聯系起來。

為layer加動畫(動畫組):

先創建動畫組CAAnimationGroup,它可以容納若干動畫,然后創建若干CABasicAnimation基礎動畫。分別設置屬性,動畫組需要涉及的屬性有時間功能,kCAMediaTimingFunctionEaseIn表示逐漸加快,另外還有設置持續時間,設置kCAFillModeForwards表示動畫在結束后會保持,removedOnCompletion = NO表示最后不移除。在基礎動畫的設置中,一般設置在動畫組中的起始時間和持續時間,還有參數的變化。最后的 group.animations = @[scaleAnimtion,widthStartAnimtion,widthEndAnimtion];[circleLayer addAnimation:group forKey:nil];兩句表示在動畫組中添加動畫然后為layer添加動畫組,這樣layer就有動畫特效了。

//動畫CAAnimationGroup *group = [CAAnimationGroup animation]; group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; NSTimeInterval groupInterval = self.animationDurtion * 0.8; group.duration = groupInterval; group.fillMode = kCAFillModeForwards; group.removedOnCompletion = NO; CABasicAnimation * scaleAnimtion = [CABasicAnimation animationWithKeyPath:@'transform.scale']; scaleAnimtion.beginTime = 0; scaleAnimtion.duration = groupInterval * 0.8; scaleAnimtion.fromValue = @(0); scaleAnimtion.toValue = @(1); CABasicAnimation * widthStartAnimtion = [CABasicAnimation animationWithKeyPath:@'lineWidth']; widthStartAnimtion.beginTime = 0; widthStartAnimtion.duration = groupInterval * 0.8; widthStartAnimtion.fromValue = @(1); widthStartAnimtion.toValue = @(2); CABasicAnimation * widthEndAnimtion = [CABasicAnimation animationWithKeyPath:@'lineWidth']; widthEndAnimtion.beginTime = groupInterval * 0.8; widthEndAnimtion.duration = groupInterval * 0.2; widthEndAnimtion.fromValue = @(2); widthEndAnimtion.toValue = @(0); group.animations = @[scaleAnimtion,widthStartAnimtion,widthEndAnimtion]; [circleLayer addAnimation:group forKey:nil];

點贊動畫的實現原理

下面來介紹demo的實現原理。

controller的尺寸設置為全屏,在其上方也覆蓋一個全屏的view,再在view上添加點擊事件(手勢)。

- (void)addGesture{ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(creatOneHeart:)]; [self addGestureRecognizer:tap]; }

下面看看點擊后調用的方法:

這里每次點擊都會獲取點擊的位置然后去初始化一個愛心,這是異步任務,放在主隊列中執行。

- (void)creatOneHeart:(UITapGestureRecognizer *)sender{ CGPoint point = [sender locationInView:self]; dispatch_async(dispatch_get_main_queue(),^{ [self initOneNewHeart:point]; });}

這段代碼創建了視圖對象,這里自然用到了事先創建好的心形圖片。這里把創建的imageview存到隊列,顯示到view上,最后調用likeAction:方法執行動畫。

- (UIImageView *)createGiveLikeView{ UIImageView *giveLikeView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; giveLikeView.backgroundColor = [UIColor clearColor]; UIImage *image = [UIImage imageNamed:@'icon_home_like_after']; giveLikeView.userInteractionEnabled = YES; giveLikeView.tag = GiveType; giveLikeView.image = image; giveLikeView.hidden = NO; _giveLikeView = giveLikeView; return _giveLikeView;}- (void)initOneNewHeart:(CGPoint)point{ UIImageView *giveLikeView = [self createGiveLikeView]; giveLikeView.center = point; [self.array addObject:giveLikeView]; [self addSubview:giveLikeView]; [self likeAction:giveLikeView];}

我們看看giveLikeAction:這個方法,它包括執行心形的變化動畫和繪制六個輻射的三角形動畫,還有輻散的圓的動畫。

- (void)likeAction:(UIImageView *)giveLikeView{ [self giveLikeAction:giveLikeView];}- (void)giveLikeAction:(UIImageView *)giveLikeView{ [self animtionChangeLikeType:giveLikeView]; [self createTrigonsAnimtion:giveLikeView]; [self createCircleAnimation:giveLikeView];}

接下來直接看看輻散的三角形的動畫(愛心的變化動畫在上面已經涉及到了):這段代碼跑了6個循環,做了6個三角形,它們分別有動畫效果。shape.transform = CATransform3DMakeRotation(3.14 / 3 * i, 0, 0, 1);實現了旋轉。[giveLikeView.layer addSublayer:shape];執行layer的添加。因為在循環中,每個layer都有獨立的動畫,動畫組實現的效果是三角形從小變大,最后變成一條直線并消失。下面的兩行代碼用到了__bridge,它的作用是實現類型的轉換,這里把CGPathRef類型“橋接”轉化為了id類型,如果沒有它,會報錯。pathAnimation.fromValue = (__bridge id)startPath.CGPath;pathAnimation.toValue = (__bridge id)endPath.CGPath;

- (void)createTrigonsAnimtion:(UIImageView *)giveLikeView{ for(int i=0;i<6;i++) { //創建一個layer并設置位置和填充色 CAShapeLayer *shape = [[CAShapeLayer alloc] init]; shape.position = CGPointMake(giveLikeView.bounds.size.width/2, giveLikeView.bounds.size.height/2); shape.fillColor = [UIColor redColor].CGColor; //設置貝塞爾曲線,執行路徑 UIBezierPath *startPath = [[UIBezierPath alloc] init]; [startPath moveToPoint:CGPointMake(-2, 30)]; [startPath addLineToPoint:CGPointMake(2, 30)]; [startPath addLineToPoint:CGPointMake(0, 0)]; [startPath addLineToPoint:CGPointMake(-2, 30)]; shape.path = startPath.CGPath; //旋轉 shape.transform = CATransform3DMakeRotation(3.14 / 3 * i, 0, 0, 1); [giveLikeView.layer addSublayer:shape]; //動畫組 CAAnimationGroup *groupAnimation = [CAAnimationGroup animation]; groupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; groupAnimation.duration = self.animationDurtion; groupAnimation.fillMode = kCAFillModeForwards; groupAnimation.removedOnCompletion = NO; //基礎動畫1 CABasicAnimation *scaleAnimtion = [CABasicAnimation animationWithKeyPath:@'transform.scale']; //縮放時間占20% scaleAnimtion.duration = self.animationDurtion * 0.2; scaleAnimtion.fromValue = @(0); scaleAnimtion.toValue = @(1); //繪制三角形結束 一條直線 UIBezierPath *endPath = [UIBezierPath bezierPath]; [endPath moveToPoint:CGPointMake(-2, 30)]; [endPath addLineToPoint:CGPointMake(2, 30)]; [endPath addLineToPoint:CGPointMake(0, 30)]; //基礎動畫2 CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@'path']; pathAnimation.beginTime = self.animationDurtion * 0.2; pathAnimation.duration = self.animationDurtion * 0.8; pathAnimation.fromValue = (__bridge id)startPath.CGPath; pathAnimation.toValue = (__bridge id)endPath.CGPath; groupAnimation.animations = @[scaleAnimtion,pathAnimation]; [shape addAnimation:groupAnimation forKey:nil]; }}

demo實現的動畫效果

iOS實現點贊動畫特效

demo的GitHub鏈接

最后附上demo鏈接:MYFGiveLikeAnimationDemo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美一级| 国产一区二区精品久| 成人片免费看| 精品免费视频| 久久国产麻豆精品| 日韩av中文在线观看| 伊人精品视频| 深夜福利一区| 麻豆精品视频在线观看| 日韩免费福利视频| 六月天综合网| 国产精品色婷婷在线观看| 色综合五月天| 红桃视频国产精品| 亚洲精品欧美| 欧美成人一二区| 亚洲福利专区| 婷婷精品久久久久久久久久不卡| 国产毛片精品| 亚洲91视频| 日韩**一区毛片| 精品一区电影| 亚洲第一区色| 国产欧美日韩一区二区三区四区| 中文在线а√在线8| 国产精品免费看| 欧美精品影院| 国产99精品| 免费高潮视频95在线观看网站| 日韩精品一区二区三区免费视频 | 日本免费在线视频不卡一不卡二| 国产精品欧美日韩一区| 91精品蜜臀一区二区三区在线| 涩涩av在线| 四虎精品一区二区免费| 久久亚州av| 韩日一区二区三区| 国产精品嫩模av在线| 不卡福利视频| 亚洲一级淫片| 成人精品高清在线视频| 免费看黄色91| 国产伦久视频在线观看| 久久亚洲欧洲| 999国产精品永久免费视频app| 99热精品在线观看| 国产精品久久亚洲不卡| 欧美日韩激情| 亚洲精品婷婷| 神马久久午夜| 国产精品一区高清| 国产精品日本欧美一区二区三区| 国产成人精品一区二区免费看京| 视频一区免费在线观看| 国内精品伊人| 91嫩草精品| 免费日韩av| 久久久久蜜桃| 国产一区二区三区国产精品| 日韩**一区毛片| 五月天久久777| 黄色aa久久| 欧美激情综合| 久久不射中文字幕| 久久久国产精品一区二区中文| 国产日韩一区二区三区在线播放| 欧美在线资源| 日韩国产欧美一区二区| 国产精选久久| 日韩高清成人在线| 欧美+亚洲+精品+三区| 国产婷婷精品| 麻豆mv在线观看| 国产一级成人av| 蜜桃91丨九色丨蝌蚪91桃色| 久久久久国产精品一区二区| 国产麻豆一区二区三区精品视频| 在线国产精品一区| 在线观看精品| 欧美国产亚洲精品| 日韩一区二区三免费高清在线观看| 在线看片不卡| 欧美特黄一区| 亚洲黄页一区| 国产精品毛片| 免费视频久久| 一区二区91| 免费欧美在线视频| 中文不卡在线| 亚洲视频国产精品| 在线国产日韩| 最新国产精品久久久| 三级一区在线视频先锋| 欧美不卡高清| re久久精品视频| 欧美日韩国产免费观看| 欧美日韩国产欧| 亚洲欧美日韩视频二区| 日韩福利视频一区| 国产日韩综合| 一区久久精品| 国产亚洲永久域名| 黄色成人91| 久色成人在线| 中文字幕一区二区精品区| 蜜臀av一区二区三区| 亚洲一区二区日韩| 日韩精品一区二区三区中文在线| 男人的天堂久久精品| 日本在线视频一区二区| 日本三级亚洲精品| 欧美精品影院| 精品无人区麻豆乱码久久久| 在线人成日本视频| 欧美综合另类| 在线精品亚洲| 美女精品视频在线| 日韩黄色大片网站| 成人av二区| 婷婷亚洲精品| 欧美国产日本| 成人va天堂| 一本色道精品久久一区二区三区| 国产精品嫩草99av在线| 亚洲精品欧美| 久久精品一本| 一区二区三区四区在线看| 在线精品视频一区| 精品国产精品久久一区免费式| 999国产精品999久久久久久| 亚洲精品国产精品粉嫩| 国产精品久久久久77777丨| 丁香六月综合| 免费人成在线不卡| 麻豆精品视频在线观看| 婷婷成人基地| 日韩福利视频导航| 天堂av在线| 尤物精品在线| 欧美精品中文字幕亚洲专区| 日韩欧美午夜| 亚洲精一区二区三区| 久久在线91| 午夜国产欧美理论在线播放| 国产亚洲精品美女久久| 日韩不卡视频在线观看| 色狠狠一区二区三区| 国产精品毛片久久| 综合视频一区| 肉色欧美久久久久久久免费看| 亚洲综合图色| 日韩亚洲一区在线| 欧美啪啪一区| 激情综合激情| 国产一卡不卡| 在线亚洲精品| 精品视频高潮| 亚洲一区二区免费在线观看| 欧美片第1页| 欧美亚洲福利| 99riav1国产精品视频| 精品视频高潮| 日本久久二区| 欧美特黄视频| 欧美男人天堂| 欧美日韩中出| 免费不卡在线观看| 三级精品视频| 欧美久久亚洲| 欧美午夜不卡| 国产一区三区在线播放| 中文字幕免费一区二区| 久久精品不卡| 电影91久久久| 国产精品亲子伦av一区二区三区| 三级欧美韩日大片在线看| 久久国产日本精品| 麻豆成人91精品二区三区| 亚洲三级毛片| 午夜电影亚洲| 欧洲亚洲一区二区三区| 久久免费影院| 国产精品久久久免费| 免费人成在线不卡| 欧美日韩国产综合网| 天堂√中文最新版在线| 麻豆91小视频| 国产精品一页| 国产欧美三级| 91成人精品观看| 日韩欧美久久| 亚洲一级大片| 水蜜桃久久夜色精品一区的特点| 亚洲小说欧美另类婷婷| 日韩国产综合| 视频二区不卡| 久久激情中文| 亚洲夜间福利| 欧美+日本+国产+在线a∨观看| 精品国模一区二区三区|