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

首頁 > 系統 > iOS > 正文

iOS 利用動畫和貝塞爾實現咻咻效果

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

先上效果圖:


圓形

方形

思路分析:

這四種風格其實就是兩種, 一種是動畫效果在視圖View的內部, 另一種是在視圖的外部! 我們可以嘗試封裝自定義 View 設置相關屬性去實現這兩個風格. 點擊時候觸及動畫, 說明要在這個 View 上添加手勢! 分析動畫效果其實是兩種, 第一種是視圖的比例由小到大,第二種是動畫顯示效果是漸漸變暗! 那么我們可以把兩種效果寫到一個動畫組中!還有一個問題是效果的形狀, 也就是 Layer 動畫展示的形狀有方形有圓形, 這個形狀就需要我們思考如何去繪制和判斷!

代碼分析:

首先要創建自定義一個 View 類去實現點擊有動畫的效果! 因為分析有兩種風格(在外在內)的動畫, 因此要在. h 文件中聲明屬性去接收外界告知的風格! 我們還可以添加一些供外界修改的值, 比如動畫的邊界粗細, 填充顏色, 動畫時間等等這里我用一個顏色舉例! 外界可提供一個顏色, 怎么用具體代碼中有!

typedef NS_ENUM(NSUInteger, FlashButtonType){  # 風格定義一個枚舉類型的去表示 分別是代表動畫在里面和外面 (便于理解)  DDFlashButtonInner = 0,  DDFlashButtonOuter = 1};# 定義的兩個屬性@property (strong, nonatomic) UIColor *flashColor;@property (assign, nonatomic) FlashButtonType buttonType;# 寫這個方法可以對 View 的子視圖上的子控件進行操作, 可以不把子控件都暴露出去- (void)setText:(NSString *)text withTextColor:(UIColor *)textColor;

第 2 步: 在初始化方法中,我們可以給這個 view 加一些子視圖比如 UILabel 去顯示一些想表達的文字(這里還可以寫個方法去改變 label上 text 的屬性,)! 還需要給 View 添加點擊手勢!

- (instancetype) initWithFrame:(CGRect)frame{  if (self = [super initWithFrame:frame]) {# 創建手勢 并添加到 View 上    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTap:)];     [self addGestureRecognizer:tap];    self.textLabel = [[UILabel alloc] initWithFrame:self.bounds];    self.textLabel.backgroundColor = [UIColor clearColor];    [self.textLabel setTextAlignment:NSTextAlignmentCenter];    [self addSubview:self.textLabel];    self.backgroundColor = [UIColor cyanColor];# 給一個默認的風格 不設置就是代表 動畫在里面    self.buttonType = DDFlashButtonInner;  }    return self;}

第 3 步: 可以給子控件給一些屬性 這里有 label 還寫了個方法

- (void)setText:(NSString *)text withTextColor:(UIColor *)textColor{# 就是給 Label 賦外界傳來的值 若有其他的控件可以改一些參數用此方法  if (text)  {    [self.textLabel setText:text];  }  if (textColor)  {    [self.textLabel setTextColor:textColor];  }}

第 4 步: 根據風格的不同我們要控制動畫展示的范圍, 也就是加入動畫在內部就不能超過 View 的范圍

# 這里就是重寫了ButtonType setter方法,同時判斷一下風格根據風格選擇是否把超過視圖 View 的部分裁剪掉- (void)setButtonType:(FlashButtonType)buttonType{  _buttonType = buttonType;    if (buttonType == DDFlashButtonInner)  {// 內容和子視圖是夾在視圖的邊界內 ( 只允許 view范圍內有子視圖和類容可以顯示 )    self.clipsToBounds = 1;  }else  {// 外面可以顯示    self.clipsToBounds = 0;  }}

第 5 步: 準備工作做好后, 一個思路就是去寫點擊事件, 需要什么就去創建什么! 這先去思考點擊事件中需要的東西, 都滿足之后再去寫完善點擊事件! 動畫效果首先需要動畫, 另外還需要能添加動畫的 Layer;首先寫個得到動畫的方法!

- (CAAnimationGroup *)createFlashAnimationWisthScale:(CGFloat)scale                      duration:(CGFloat)duratiton{# 創建按比例收縮變大的動畫// 指定要在渲染動畫性能時的關鍵路徑 也就是圖形轉換的方式 這里是按收縮比例 這里也可以不用.scale 因為我們初始值設置是根據CATransform3D  CABasicAnimation *scaleAnnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];// 動畫開始點  // 這個動畫效果初值 就是本身的原始的位置  scaleAnnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];  // 等價 scaleAnnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1)];// 動畫結束點  // 在 x 軸和 y 軸的變化比例  scaleAnnimation.toValue = [NSValue valueWithCATransform3D:(CATransform3DMakeScale(scale, scale, 1))];# 創建透明度變換的動畫  CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];  alphaAnimation.fromValue = @1;  alphaAnimation.toValue = @0;# 創建動畫組把上面兩個動畫加進去   CAAnimationGroup *animation = [CAAnimationGroup new];  animation.animations = @[scaleAnnimation,alphaAnimation];// 動畫效果 (節奏, Timing Function的會被用于變化起點和終點之間的插值計算.形象點說是Timing Function決定了動畫運行的節奏(Pacing),比如是均勻變化(相同時間變化量相同),先快后慢,先慢后快還是先慢再快再慢.)  animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];# 返回我們想要的動畫效果組   return animation;}

第 6 步: 得到一個CAShapeLayer 類型的圖層(因為要結合貝塞爾曲線得到形狀路徑), 畫一個形狀那么就需要有位置

- (CAShapeLayer *)creatCircleShapWithPostion:(CGPoint)position                  pathRect:(CGRect)rect                   radius:(CGFloat)radius{  CAShapeLayer *circleShap = [CAShapeLayer layer];// 從貝塞爾曲線取到形狀  circleShap.path = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius].CGPath;// 雖然得到了形狀, 但是并沒有得到具體的 frame(bounds) 也就是實際上并沒有范圍 只是可以展現動畫的效果 那么錨點其實就是設置的位置點  circleShap.position = position;  if (self.buttonType == DDFlashButtonInner)  {# 在這里設置 frame 就是為了滿足我們想要的錨點位置讓動畫效果動起來, 下面也一樣, 可以不設置試試效果就明白了!   // circleShap.bounds = CGRectMake(0, 0, radius *2, radius *2);   circleShap.frame = CGRectMake(position.x-radius, position.y-radius, radius*2, radius*2);    // 線寬    circleShap.lineWidth = 1;    // 填充的顏色 不設置默認就給黃色    circleShap.fillColor = self.flashColor ? self.flashColor.CGColor:[UIColor yellowColor].CGColor;  }else  {     circleShap.frame = self.bounds;   // 線寬    circleShap.lineWidth = 5;    circleShap.fillColor = [UIColor clearColor].CGColor;  // 邊緣線的顏色 不設置就默認給個紫色  circleShap.strokeColor = self.flashColor ? self.flashColor.CGColor:[UIColor purpleColor].CGColor;  }  // 不透明度 要設置成透明的 不然內部風格的時候會畫出來圖案點點  circleShap.opacity = 0;  return circleShap;}

第 7 步 : 把點擊的事件完成就 OK 了

- (void)didTap:(UITapGestureRecognizer *)tapGesture{// 獲取點擊點的位置  CGPoint tapLocation = [tapGesture locationInView:self];// 定義一個圖層 下面分情況去給予不同形狀   CAShapeLayer *circleShape = nil;// 默認一個變化比例 1 倍   CGFloat scale = 1.0f;// 獲取 View 的寬和高   CGFloat width = self.bounds.size.width, height = self.bounds.size.height;   if (self.buttonType == DDFlashButtonInner)  {# 這里就是在視圖內部效果, 就是以點擊的點為圓心 畫一個小圓(這里是半徑為1) 然后讓它動畫起來 (不斷的變大并變透明) 所以放大倍數只要能到最大的變就行了 不一定非要這樣寫, 你開心就好!    CGFloat biggerEdge = width > height ? width :height;     CGFloat radius = 1    scale = biggerEdge / radius + 0.5;# 調用方法獲得圖層 錨點位置就是點擊的位置circleShape = [self creatCircleShapWithPostion:CGPointMake(tapLocation.x , tapLocation.y ) pathRect:CGRectMake(0, 0, radius * 2, radius * 2) radius:radius];     }else  {# 這個是外部動畫效果 設置能放大5.5倍    scale = 5.5f;# 錨點位置在 View 的中心 這個圖層和 View 是一樣的形狀范圍   circleShape = [self creatCircleShapWithPostion:CGPointMake(width /2 , height / 2) pathRect:self.bounds radius:self.layer.cornerRadius];   }// view圖層 上添加 有形狀的自定義圖層  [self.layer addSublayer:circleShape];# 給自定義圖層添加動畫    [circleShape addAnimation:[self createFlashAnimationWisthScale:scale duration:1.0f] forKey:nil];}

最后說一句: 用的時候在 viewController 中引入, 創建自定義的 View 實例對象, 改變傳入的風格和顏色就可以展示效果了!

iOS基礎-動畫效果的總結--(CALayer ― 粉骨碎身全不怕,要留清白在人間!<小拳石>動畫的思維導圖基礎知識:iOS能夠實現動畫的方式:(如上圖)UIView基礎實現方式一UIView基礎實現方式二CoreAnimation實現方式動畫的效果簡述:傳達狀態提高用戶對直接操作的感知幫助用戶可視化操作的結果UIVIew的基礎動畫:UIKit直接將動畫繼承到UIView類中,當內部的一些屬性發生改變時,UIView將為這些改變提供動畫支持.執行動畫的工作由UIView類自動完成,但希望在...

原文鏈接:http://www.jianshu.com/p/c187c7005ce1
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人性视频| 国产一区二区日韩精品欧美精品| 精品国偷自产在线视频99| 国产精品视频专区| 欧美成人黑人xx视频免费观看| 欧美中文在线字幕| 欧美性猛交xxxx乱大交3| 欧美极品少妇xxxxⅹ喷水| 国产美女高潮久久白浆| 麻豆精品精华液| 久久精品久久久久久| 中文字幕日韩高清| 国产精品第100页| 日韩电影大片中文字幕| 色天天综合狠狠色| 九九九热精品免费视频观看网站| 亚洲2020天天堂在线观看| 精品国产一区二区三区久久狼5月| 欧美怡红院视频一区二区三区| 中文字幕亚洲欧美日韩高清| 日韩a**站在线观看| 国产香蕉精品视频一区二区三区| 亚洲爱爱爱爱爱| 久久成人综合视频| 久久久久五月天| 亚洲欧美成人在线| 97视频在线观看成人| 色悠悠久久88| 国产国产精品人在线视| 亚洲色图av在线| 欧美激情视频一区二区三区不卡| 久久久久久久久网站| 日韩精品中文在线观看| 亚洲精品免费在线视频| 亚洲精品国产suv| 中文字幕一精品亚洲无线一区| 欧美理论电影在线观看| 91牛牛免费视频| 国产精品久久久久秋霞鲁丝| 久久久久久久久久久国产| 成人免费xxxxx在线观看| 欧美性视频在线| 日韩欧美福利视频| 欧美性生交xxxxx久久久| 亚洲最大的网站| 色偷偷9999www| 亲爱的老师9免费观看全集电视剧| 自拍偷拍亚洲精品| 亚洲开心激情网| 疯狂做受xxxx高潮欧美日本| 欧美性xxxx极品高清hd直播| 色哟哟入口国产精品| 国产免费一区二区三区在线能观看| 成人在线国产精品| 国产日韩欧美一二三区| 26uuu亚洲伊人春色| 亚洲黄色免费三级| 精品国产自在精品国产浪潮| 在线观看日韩www视频免费| 在线精品播放av| 亚洲国产精品99| 亚洲人成亚洲人成在线观看| 日韩在线免费高清视频| 中文字幕亚洲欧美日韩高清| 中文字幕亚洲第一| 久久久久久久久综合| 国产精品高潮呻吟久久av黑人| 久久久久久久久久久免费精品| 在线激情影院一区| 国产精品流白浆视频| 欧美成人激情在线| 九九久久久久99精品| 亚洲欧美国产视频| 欧美日韩xxx| 中文字幕亚洲无线码在线一区| 国产精品国模在线| 九九热精品视频| 国模gogo一区二区大胆私拍| 国产精品久久久久久久久借妻| 亚洲国产精品热久久| 欧美日韩另类视频| 成人乱色短篇合集| 欧美劲爆第一页| 亚洲一区二区福利| 欧美成人免费全部观看天天性色| 日韩电影在线观看永久视频免费网站| 精品国模在线视频| 日本欧美爱爱爱| 国产成人一区二区三区小说| 午夜精品久久久久久久白皮肤| 亚洲free嫩bbb| 日韩欧美主播在线| 国产一区二区黄| 亚洲欧美在线一区| 欧美精品久久久久久久久久| 亚洲人a成www在线影院| 91亚洲精品久久久久久久久久久久| 日韩在线激情视频| 亚洲国产免费av| 日韩av网站在线| 国产视频亚洲视频| 欧美国产日韩精品| 亚洲福利在线视频| 日韩av影视在线| 爽爽爽爽爽爽爽成人免费观看| 日本一区二三区好的精华液| 国产精品日韩在线观看| 亚洲综合日韩中文字幕v在线| 国产成人精品视频在线| 精品久久久久久久久中文字幕| 日本一区二区在线免费播放| 91精品国产乱码久久久久久蜜臀| 亚洲午夜久久久久久久| 亚洲a一级视频| 国产精品午夜国产小视频| 91精品国产九九九久久久亚洲| 国产精品十八以下禁看| 亚洲精品乱码久久久久久金桔影视| 久久久久久久电影一区| 国产一区二区三区毛片| 狠狠干狠狠久久| 国产成人一区二| 欧美天天综合色影久久精品| 亚洲一区国产精品| 日韩欧美一区二区在线| 精品中文视频在线| 96精品视频在线| 亚洲成人三级在线| 欧美成人免费va影院高清| 国产一区二区三区在线播放免费观看| 欧美电影免费观看大全| 亚洲а∨天堂久久精品9966| 97精品欧美一区二区三区| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美日韩综合| 国产精品一区专区欧美日韩| 亚洲精品综合久久中文字幕| 国产日韩中文字幕在线| 91视频8mav| 欧美日韩免费网站| 亚洲在线免费观看| 国产精品一区久久| 国内精品中文字幕| 国产精品一区二区三区久久久| 另类专区欧美制服同性| 欧美性高潮在线| 亚洲成人免费在线视频| 日日噜噜噜夜夜爽亚洲精品| 成人久久一区二区三区| 成人精品在线视频| 亚洲人成电影在线观看天堂色| 亚洲电影中文字幕| 91精品国产高清久久久久久久久| 欧美激情国产精品| 国产精品中文字幕在线| 亚洲国产成人久久综合一区| 国内精品久久久久影院优| 日韩在线欧美在线国产在线| 在线播放日韩专区| 国产精品成人av性教育| 国产精品久久久精品| 国产一区二区精品丝袜| 国内精品久久影院| 国产久一一精品|