iOS仿騰訊視頻亮度修改動畫

動畫效果視頻.gif

核心思路:通過日食擦除遮擋區(qū)域

日食

先畫一個(gè)太陽帖世,在用一個(gè)等大小的太陽擦除掉覆蓋區(qū)域,其中日食運(yùn)行起點(diǎn)是45°沸枯,終點(diǎn)是225°日矫。日食的起點(diǎn)圓心與終點(diǎn)圓心就是運(yùn)行軌跡的半徑赂弓。通過三角函數(shù)(以知斜邊和度數(shù))計(jì)算出終點(diǎn)坐標(biāo)P1(x,y) ,起點(diǎn)坐標(biāo)P2(x,y) 再用三角函數(shù)計(jì)算處軌跡的中心點(diǎn)

光芒

12個(gè)光芒哪轿,360°盈魁,每30°畫一個(gè)光芒,以太陽圓心為光芒圓心 + 光芒與太陽間距 = 光芒起點(diǎn)坐標(biāo) 窃诉,再通過這個(gè)坐標(biāo)利用三角函數(shù) + 光芒長度 計(jì)算出光芒終點(diǎn)坐標(biāo)

圖形示例

企業(yè)微信截圖_f84cd455-41bb-416f-ad36-1db28961bcdf.png

藍(lán)色圓:太陽
藍(lán)色虛線圓:日食起點(diǎn)
紅色虛線圓:日食終點(diǎn)
綠色虛線圓:日食運(yùn)行軌跡

不多BB杨耙,看代碼

- (void)drawRect:(CGRect)rect{
    [super drawRect:rect];    
     CGContextRef context = UIGraphicsGetCurrentContext();
     CGContextClearRect(context, rect);
     CGFloat raysH = 5.0;  //光芒長度(可以自己寫個(gè)比例)
     CGFloat raysW = 2.0;
     CGFloat raysGap = 3.0;
     CGFloat radius = (MIN(rect.size.width, rect.size.height) - (raysH + raysGap) * 2) / 2.0 - 2;
     CGPoint center = CGPointMake(rect.size.width / 2.0, rect.size.height / 2.0);

     //太陽
     CGContextAddArc(context, center.x, center.y , radius, 0, 2 * M_PI, 0);
     CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
     CGContextFillPath(context);

    //軌跡  起點(diǎn)45° 終點(diǎn)為225° 逆時(shí)針運(yùn)行 運(yùn)行軌跡為半圓形 其中 gap月亮與太陽之間的圓心距,將決定月亮內(nèi)弧與外弧之間的距離
    CGFloat gap = 15.0 * radius / 30.0;
    CGFloat finalX = center.x - gap * cos(M_PI_4);
    CGFloat finalY = center.y - gap * sin(M_PI_4);

    CGFloat trackRadius = (radius * 2.0 + gap) / 2.0;
    CGFloat trackX = finalX + trackRadius * cos(M_PI_4);
    CGFloat trackY = finalY + trackRadius * sin(M_PI_4);

    CGFloat x = trackX + trackRadius * cos(M_PI_4 - (1 - _brightness) * M_PI);
    CGFloat y = trackY + trackRadius * sin(M_PI_4 - (1 - _brightness) * M_PI);
    CGContextAddArc(context, x, y, radius, 0, 2 * M_PI, 0);
    CGContextSetBlendMode(context, kCGBlendModeClear);
    CGContextFillPath(context);

//    CGFloat trackAngle = (M_PI_4 - (1 - _brightness) * M_PI) * 180 / M_PI;
//    NSLog(@"軌跡角度:%f",trackAngle);
    NSLog(@"位置信息:\n軌跡:x:%f y:%f r:%f \n太陽:x:%f y:%f r:%f",trackX,trackY,trackRadius,x,y,radius);


    //光芒 起點(diǎn)270° 順時(shí)針運(yùn)行一周 每30°畫一個(gè)光芒 總共12個(gè)
    CGContextSetLineWidth(context, raysW);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetStrokeColorWithColor(context, UIColor.whiteColor.CGColor);
    CGContextSetBlendMode(context, kCGBlendModeNormal);

    CGFloat radian = 3 * M_PI_2 + _brightness * 2 * M_PI;
    CGFloat angle = radian * 180 / M_PI;
    int num = ceil((angle - 270) / 30.0);

    for (int i = 0; i < num; i++) {

        CGFloat raysRadian = 3 * M_PI_2 + (M_PI / 6) * i;

        CGFloat raysStartX = center.x + (radius + raysGap) * cos(raysRadian);
        CGFloat raysStartY = center.y + (radius + raysGap) * sin(raysRadian);
        CGContextMoveToPoint(context, raysStartX,raysStartY);
        if(i == num - 1 && angle - 270 != 360){

            CGFloat h = raysH * fmod(angle,30.0) / 30.0;

            CGFloat raysEndX = raysStartX + h * cos(raysRadian);
            CGFloat raysEndY = raysStartY + h * sin(raysRadian);
            CGContextAddLineToPoint(context, raysEndX,raysEndY);
        }else{
            CGFloat raysEndX = raysStartX + raysH * cos(raysRadian);
            CGFloat raysEndY = raysStartY + raysH * sin(raysRadian);
            CGContextAddLineToPoint(context, raysEndX,raysEndY);
        }
       
        CGContextStrokePath(context);

    }

    NSLog(@"光芒角度:%f  光芒個(gè)數(shù):%d",angle , num);

    
}

- (void)setBrightness:(CGFloat)brightness{
    _brightness = brightness;
    [self setNeedsDisplay];

}

備注:在View中- (void)drawRect:(CGRect)rect會造成CPU的計(jì)算飘痛,可以這里寫個(gè)優(yōu)化珊膜,用CAShapeLayer重寫- (void)drawInContext:(CGContextRef)ctx ,也可以緩存一下重復(fù)的計(jì)算

我就畫著玩 宣脉, 喵了個(gè)咪 ~
有啥問題可以留言车柠,看到會回你 ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脖旱,隨后出現(xiàn)的幾起案子堪遂,更是在濱河造成了極大的恐慌,老刑警劉巖萌庆,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溶褪,死亡現(xiàn)場離奇詭異,居然都是意外死亡践险,警方通過查閱死者的電腦和手機(jī)猿妈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巍虫,“玉大人彭则,你說我怎么就攤上這事≌家#” “怎么了俯抖?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓦胎。 經(jīng)常有香客問我芬萍,道長,這世上最難降的妖魔是什么搔啊? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任柬祠,我火速辦了婚禮,結(jié)果婚禮上负芋,老公的妹妹穿的比我還像新娘漫蛔。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布莽龟。 她就那樣靜靜地躺著蠕嫁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轧房。 梳的紋絲不亂的頭發(fā)上拌阴,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音奶镶,去河邊找鬼迟赃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厂镇,可吹牛的內(nèi)容都是我干的纤壁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捺信,長吁一口氣:“原來是場噩夢啊……” “哼酌媒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迄靠,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秒咨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掌挚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雨席,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年吠式,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陡厘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡特占,死狀恐怖糙置,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情是目,我是刑警寧澤谤饭,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站懊纳,受9級特大地震影響网持,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜长踊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萍倡。 院中可真熱鬧身弊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凑术,卻和暖如春翩蘸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淮逊。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工催首, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泄鹏。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓郎任,卻偏偏與公主長得像,于是被迫代替她去往敵國和親备籽。 傳聞我的和親對象是個(gè)殘疾皇子舶治,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容