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

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

[💯原]IOS之Metro實現,擁有windows磁帖效果(一動畫效果的實現)

2019-11-14 19:56:14
字體:
來源:轉載
供稿:網友

IOS之Metro實現,擁有windows磁帖效果(一 動畫效果的實現) 

  所有轉出“博客園”的朋友請您注明出處:http://www.49028c.com/xiaobajiu/p/4084717.html

  扁平化來襲,微軟的metro風格看起來很有科技感。于是想寫個IOS的metro控件。搞了一段時間,有了模樣。我的想法是metro和wp8的差不多,展示信息通過旋轉來展示,觸摸metro它會撬動或者吸彈。點擊metro會執行事件,長按磁帖又可以執行其他事件。該帖中將詳細展示我的設計思路希望能給初學者更多啟發和學習資源。

  metro的結構:metro最外層是骨架,該層的作用是站住位置,內部的大小變化和metro的拖拽都不會影響到外部的結構。骨架外是蒙板層內容層。蒙板層在下方作用是metro主題色,內容層存放要展示的兩面視圖。值得注意的是蒙板層在不設置主題的情況下是隱藏的。

metro結構-大圖

  那么直接進入最關心的地方,動畫。IOS的動畫是廉價的,不像Windows,其他平臺都像拿筆在畫,IOS就像打印機在刷圖。IOS上主要的繪圖相關的有Quartz2D,核心動畫等應付簡單的旋轉和伸縮的畫使用UIViewAnimation就足夠了,而且代碼簡短。旋轉的效果竟然只要一行: view.layer.transform= CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z) 這樣子就可以實現旋轉效果。下面是一段完整的磁帖旋轉代碼的截?。?/p>

/** *  (PRivate)metro的旋轉動畫 */- (void)revolveMetro{    _isViewDleaying= NO;    [UIView animateWithDuration:_turnTimes[_currentViewID] delay:0.0 options:UIViewAnimationOptionCurveEaseIn|UIViewAnimationOptionAllowUserInteraction animations:^{        _isAnimating= YES;//修改動畫狀態        _container.layer.transform= CATransform3DMakeRotation(M_PI_2, 1.0, 0.0, 0.0);        if(!_maskingView.hidden)            _maskingView.layer.transform= CATransform3DMakeRotation(M_PI_2, 1.0, 0.0, 0.0);    } completion:^(BOOL finished) {        ((UIView*)self.views[_currentViewID]).hidden= YES;        ((UIView*)self.views[[self nextIndexNowNextView]]).hidden= NO;        [UIView animateWithDuration:_turnTimes[_currentViewID] delay:0.0 options:UIViewAnimationOptionCurveEaSEOut animations:^{            _container.layer.transform= CATransform3DMakeRotation(- M_PI_4/2, 1.0, 0.0, 0.0);            if(!_maskingView.hidden)                _maskingView.layer.transform= CATransform3DMakeRotation(- M_PI_4/2, 1.0, 0.0, 0.0);        } completion:^(BOOL finished) {            [UIView animateWithDuration:_turnTimes[_currentViewID] delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{                _container.layer.transform= CATransform3DMakeRotation(0, 1.0, 0.0, 0.0);                if(!_maskingView.hidden)                    _maskingView.layer.transform= CATransform3DMakeRotation(0, 1.0, 0.0, 0.0);            } completion:^(BOOL finished) {                _isAnimating= NO;//修改動畫狀態            }];        }];    }];}

   一共組合了三次動畫,每個動畫都可以通過options選項設置很多有用的屬性。比如動畫時間曲線,簡單說就是動畫隨漸漸的快慢,它畫到坐標軸上就是各種曲線。在磁帖的旋轉中有切換圖片的這種情況,有很多方法可以做比如我沒有用的一個方法: [view exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; 這個方法可以直接交換父圖層中子級索引0和1的兩個子圖層的位置。從而達到切換圖層的目的。我使用的是隱藏圖層的方法,目的是不想打亂圖層順序,方便找到某圖層。

  除了metro的旋轉還有一個動畫效果就是metro被觸摸的時候的傾斜效果。通過觀察wp8,觸摸點離中心點越遠下沉力度越大。但是靠近中心區域又是下沉效果而不是傾斜效果。通過觀察還能發現到這個動畫效果的觸發應該是在觸摸到metro的時候觸發。那么這個動畫效果可以在 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 這個函數中執行。

  那么還剩一個繁瑣的問題就是傾斜的計算的問題。諾以幾何中心為對稱軸來進行旋轉,只加以控制旋轉的角度即可實現在metro一條通過幾何中心的直線上觸摸時根據到幾何中心的距離來計算應該旋轉多少角度。而旋轉所繞對稱軸就是上一句所說的通過幾何中心的直線(觸摸點和幾何中心的連線)旋轉90度所得直線。

  可以創建一個結構結構體來代表這種向量:

/** *  帶權值的向量 */struct MetroVector{    CGFloat x;    CGFloat y;    CGFloat power;//權值標明metro下沉力度<-[0.0,1.0]};typedef struct MetroVector MetroVector;

  下一步是當觸摸metro時獲得觸摸點a。由a和中心o計算出一條向量V1,V1旋轉90度既是傾斜所需的對稱軸V2。直接將V2的x,y填入旋轉函數中即可。值得注意的是 view.layer.transform= CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)這個函數的x,y,z值的取值區間是[0.0,1.0]。關于力度我采用的是線段ao的長度,對比的是o到metro任意角的距離即對角線的半長。兩只相除得到一個0~1的數即可衡量力度。

  計算向量V2的代碼:

/** *  (private)計算metro點擊時 3D傾斜的對稱軸的向量 * *  @param view       觸摸的視圖 *  @param touchPoint 其中的觸摸點 */- (MetroVector)getVectorByTouchedView:(UIView*)view in:(CGPoint)touchPoint{    MetroVector vector;    CGFloat width= view.frame.size.width;    CGFloat height= view.frame.size.height;    CGFloat diagonal= sqrt(width* width+ height* height);//對角線    vector.x= touchPoint.x- width/2;//以幾何中心為原點的向量    vector.y= touchPoint.y- height/2;    CGFloat lenTouchBetweenCenter= sqrt(vector.x*vector.x+ vector.y* vector.y);//觸摸點到幾何中心的距離    CGFloat max= MAX(vector.x, vector.y);//取最大值,做除數,使得兩者最大值為1.0    CGFloat temp= vector.x;//交換x,y值,其中之一取反(表示將向量轉動90度,成為圖層的轉軸)    vector.x= - vector.y/max;    vector.y=  temp/max;    CGFloat len4maxPower= diagonal/2;//取對角線二分之一作為力度最大的衡量    vector.power= lenTouchBetweenCenter/ len4maxPower;    return vector;}

有了V2那么傾斜就可以直接上代碼了

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    [super touchesBegan:touches withEvent:event];    if(self.isAnimating) return;//允許摸,不允許再次動畫    CGPoint touchPos= [(UITouch*)[touches anyObject] locationInView:self];    //中心區域    CGSize viewSize= self.frame.size;    CGRect centerRect= CGRectMake(viewSize.width/4, viewSize.height/4, viewSize.width/2, viewSize.height/2);    if(CGRectContainsPoint(centerRect, touchPos)){//是否在中心區域,是則下沉動畫        [UIView animateWithDuration:macroTouchOneAnimationInterval/5 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionAllowUserInteraction animations:^{            _isAnimating= YES;            self.layer.transform= CATransform3DMakeScale(0.975, 0.975, 1.0);        } completion:^(BOOL finished) {            [UIView animateWithDuration:macroTouchOneAnimationInterval/2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{                self.layer.transform= CATransform3DMakeScale(1.0, 1.0, 1.0);            } completion:^(BOOL finished) {                _isAnimating= NO;                //..            }];        }];    }else{//偏斜動畫        MetroVector vecor=  [self getVectorByTouchedView:self in:touchPos];        [UIView animateWithDuration:macroTouchOneAnimationInterval delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionAllowUserInteraction animations:^{            _isAnimating= YES;            self.layer.transform= CATransform3DMakeRotation(randianFromAngle(30* vecor.power),vecor.x, vecor.y, 0.0);//        } completion:^(BOOL finished) {            [UIView animateWithDuration:macroTouchOneAnimationInterval/2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{                self.layer.transform= CATransform3DMakeRotation(0 ,vecor.x, vecor.y, 0.0);            } completion:^(BOOL finished) {                _isAnimating= NO;                //..            }];        }];    }}

  到目前為最為核心的動畫內容已經實現。還剩下觸摸事件的處理,和一堆所謂的業務邏輯和一些功能上的實現。樓主會在下一篇博客另外介紹。并賦上代碼下載。

  如有錯誤請朋友指正,以免誤人子弟。

  下一篇博文地址:http://www.49028c.com/xiaobajiu/p/4106663.html

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国模视频一区二区| www.xxxx欧美| 91精品久久久久久久久久久| 亚洲国产精品久久久久| www日韩中文字幕在线看| 欧美裸体xxxxx| 久久影视电视剧免费网站| 色偷偷88888欧美精品久久久| 国产成人激情视频| 久久精品成人一区二区三区| 亚洲国产精品成人一区二区| 国产免费一区二区三区在线观看| 国产精品视频网址| 成人免费在线视频网站| 91sao在线观看国产| 国产精品福利久久久| 久久精品视频va| 亚洲欧美激情另类校园| 亚洲成**性毛茸茸| 久久精品夜夜夜夜夜久久| 欧美成人免费一级人片100| 在线精品国产成人综合| 久久久久久久爱| 国产一区二区三区久久精品| 丝袜美腿亚洲一区二区| 日韩av资源在线播放| 欧美日韩国产限制| 亚洲性无码av在线| 亚洲国产精品成人va在线观看| 91精品国产综合久久久久久蜜臀| 午夜精品一区二区三区av| 欧美精品免费看| 日韩欧美精品网站| 欧美另类在线观看| 日韩av网站导航| 成人精品在线观看| 国产日韩欧美视频| 亚洲色图13p| 色综合五月天导航| 岛国av一区二区在线在线观看| 国产精品自产拍高潮在线观看| 在线精品91av| 亚洲欧美日韩图片| 午夜精品三级视频福利| 久久夜色精品亚洲噜噜国产mv| 久久久久久免费精品| 久久久免费在线观看| 不卡av电影院| 狠狠躁天天躁日日躁欧美| 久久久精品在线观看| 欧美视频13p| 亚洲精选中文字幕| 91精品在线一区| 亚洲国产婷婷香蕉久久久久久| 国产精品久久激情| 97久久精品人人澡人人爽缅北| 国产成人精品电影| 色老头一区二区三区| 久久久久亚洲精品成人网小说| 91热福利电影| 第一福利永久视频精品| 亚洲天堂免费在线| 国产日韩精品在线| 国产极品jizzhd欧美| 日韩精品在线观看网站| 久久久这里只有精品视频| 欧美电影第一页| 亚洲天堂2020| 亚洲欧美在线第一页| 秋霞av国产精品一区| 国产精品亚发布| 精品国偷自产在线视频| 国产精品福利久久久| 久久99视频免费| 精品伊人久久97| 久久久久亚洲精品成人网小说| 这里精品视频免费| 4444欧美成人kkkk| 亚洲精品网址在线观看| 91成人国产在线观看| 亚洲最大av网| 国产免费一区视频观看免费| 日韩中文字幕在线精品| 成人性教育视频在线观看| 免费91麻豆精品国产自产在线观看| 7m第一福利500精品视频| 久久精品国产精品亚洲| 岛国视频午夜一区免费在线观看| 91免费人成网站在线观看18| 欧美老妇交乱视频| 97精品国产97久久久久久免费| 久久6免费高清热精品| 久久九九国产精品怡红院| 欧美巨猛xxxx猛交黑人97人| 欧美黑人国产人伦爽爽爽| 亚洲激情视频网| 亚洲码在线观看| 最新国产精品拍自在线播放| 欧美亚洲成人网| 亚洲激情视频在线| 国产69精品99久久久久久宅男| 日韩中文字幕不卡视频| 九九热99久久久国产盗摄| 在线观看精品自拍私拍| xxxxxxxxx欧美| 亚洲第一视频网| 欧美高清在线观看| 国产精品久久久久久久av电影| 91久久精品美女高潮| 91免费欧美精品| 亚洲国产精品久久久| 国模精品一区二区三区色天香| 国产亚洲欧美另类中文| 精品福利在线看| 亚洲第一福利视频| 日韩在线观看精品| 色黄久久久久久| 亚洲97在线观看| 91av中文字幕| 97超碰国产精品女人人人爽| 亚洲一区二区福利| 成人性生交大片免费观看嘿嘿视频| 中文字幕精品—区二区| 久久青草精品视频免费观看| 97在线免费观看视频| 亚洲综合精品一区二区| 亚洲va欧美va国产综合久久| 亚洲精品成人久久久| 久久久久久久久久久久久久久久久久av| 国产成人97精品免费看片| 久久香蕉精品香蕉| 日韩在线视频导航| 九九热99久久久国产盗摄| 亚洲美女在线观看| 日本欧美一级片| 亚洲美女性生活视频| 国产精品丝袜一区二区三区| 亚洲欧美日本精品| 欧美成人午夜激情视频| 亚洲片av在线| 日韩美女视频在线观看| 欧美激情精品久久久久久久变态| 97精品伊人久久久大香线蕉| 国产美女久久久| 伊人伊人伊人久久| 国产精品免费一区| 国模精品视频一区二区三区| 92国产精品视频| 91精品国产综合久久香蕉的用户体验| 精品国产一区二区三区久久久狼| 亚洲一区二区在线播放| 日韩欧美亚洲范冰冰与中字| 亚洲美女av黄| 亚洲女人初尝黑人巨大| www.久久久久久.com| 在线视频日本亚洲性| 日韩在线观看高清| 亚洲精品免费在线视频| 国内揄拍国内精品少妇国语| 91精品国产综合久久香蕉的用户体验| 最新日韩中文字幕| 亚洲欧美国产精品久久久久久久| 国产一区二区三区高清在线观看| 欧日韩不卡在线视频|