麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

實現動畫的一種思路

2019-11-14 18:45:58
字體:
來源:轉載
供稿:網友

gitHub上看到個不錯的動畫 https://github.com/KittenYang/KYBezierBounceView 
 
沒看他代碼之前,我想了半天應該怎么實現這個效果:
這個藍色的view拉了之后是個不規則的形狀,雖然只有一邊是不規則的,但是也不能直接用frame動畫來做了,
那就只能用CAShapeLayer來自己畫形狀了,要畫一個這樣的形狀,還不能直接用 UIBezierPath已經提供的方便的類方法來畫,
只能用 Path construction的方法來畫;但是如果用Path construction的方法來畫的話,動畫做起來就麻煩了,
因為path的動畫不太好控制,只寫好path的初始值和最終值,不知道系統會怎么樣給動畫插值;
在這里因為只有一個邊在動,所以還能控制,那剩下的問題就是怎么讓動畫跟著手勢變動。
這個就只能寫個以位移為參數的生成當時整個形狀的貝塞爾曲線的函數。。。。
然后以手勢移動量來設置path就行了。
 
問題是解決了,但是實現起來好麻煩。。。所以這個方案也就僅停留在理論階段了。
 
然后看了作者代碼,發現他的實現比我想的簡單的多:
在這個藍色的view上覆蓋一個CAShaperLayer,將其填充色設置為其他顏色,然后只需要寫在動的一邊的貝塞爾曲線就行了!
 
這樣的效果看起來就像是你在拖動一個矩形的某一邊,但實際上你只是拖動了在屏幕外的一條線,拖出來一個新的layer覆蓋住了原來的view。
 
同樣的效果,看起來完全一樣,但是實現方法的難易程度卻差了很多,再考慮到之前的另外一個例子:http://www.companysz.com/Phelthas/p/4523328.html
 
讓我發現了一個看似簡單但很容易忽略的事實:
 
眼睛看到的動畫效果可以用 跟它看上去不一樣的方式甚至完全相反的方式來實現,而且實現起來說不定更簡單~~
 
就比如說上面提到的這個動畫,看起來是拖動了藍色的view,其實是拖動了看不到的一個layer。。。
 
 
另:
iOS7已經提供了UIView的彈簧動畫:
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSPRingWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
但是像path動畫這種貌似還是得用keyFrameAnimation的方式來實現,具體就是要設置keyFrame動畫的幾個關鍵幀
keyFrameAnimation.values = @[(id)path1, (id)path2, (id)path3, (id)path4, (id)path5, (id)path1];
其中path1,path2。。。分別是那幾個關鍵幀的layer的具體的位置。
 
iOS7也提供了新的關鍵幀動畫api:
+ (void)animateKeyframesWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
+ (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations NS_AVAILABLE_IOS(7_0); // start time and duration are values between 0.0 and 1.0 specifying time and duration relative to the overall time of the keyframe animation
 
需要兩個方法配合使用,例子:
[UIViewanimateKeyframesWithDuration:0.25 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:2/3.0 animations:^{
            self.label.transform = CGAffineTransformMakeScale(1.5, 1.5);
        }];
        [UIView addKeyframeWithRelativeStartTime:2/3.0 relativeDuration:1/3.0 animations:^{
            self.label.transform=CGAffineTransformMakeScale(1.0,1.0);
        }];
    } completion:^(BOOL finished) {
       
    }];
里面的方法是添加某一個關鍵幀,startTime和duration都是從0-1的相對與外面的Duration的時間,注意這兩個參數都是小數,直接1/2是不行的!!!
 
 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久影院午夜 | 亚洲射情 | 综合在线视频 | 欧美日韩爱爱视频 | 欧美黄 片免费观看 | 蜜桃传媒视频麻豆第一区免费观看 | 国产中出视频 | 黑人一级片视频 | 日韩视频区 | 国产一区二精品区在线 | 三级xxxx | 国产在线1区 | 中文字幕激情视频 | 蜜桃网站在线观看 | 97中文| 香蕉久久久精品 | 九九热精品在线 | 露脸各种姿势啪啪的清纯美女 | 91成人免费 | 久久精品视频12 | 一级黄色片在线看 | 国产91九色视频 | 久久草草亚洲蜜桃臀 | h视频在线免费看 | 亚洲综合中文 | 毛片在线免费视频 | 最新一级毛片 | 成人午夜在线免费 | 777午夜精品视频在线播放 | 日韩黄在线 | 青草av.久久免费一区 | 黄网站在线播放视频免费观看 | 国产精品一区视频 | japanese massage tube| 亚洲国产在| 一本一道久久久a久久久精品91 | 欧美综合成人 | 色av成人天堂桃色av | 毛片免费在线播放 | 中文字幕在线看第二 | 欧美性久久久 |