iOS 取兩個顏色中間的過度色

[toc]

故事背景

  • 產(chǎn)品經(jīng)理:巴拉巴拉,巴拉巴拉香伴,巴拉巴拉祖驱。。瞒窒。捺僻。
  • 我:你在講什么,我一句沒聽懂,能不能表達清楚一點
  • 產(chǎn)品經(jīng)理:你手機有裝天貓嗎匕坯?
  • 我:沒有束昵??葛峻?(我在想應該是從天貓哪里仿過來的)
  • 產(chǎn)品經(jīng)理:我給你看一下吧锹雏,就是要做這種效果,能做嗎术奖?
天貓實例.gif
  • 我:能做(就是這么自信)礁遵,我先跟 Android 和 H5 開發(fā)溝通一下!2杉恰佣耐!

需求分析

  1. banner切換的時候,改變 banner 背景區(qū)域顏色顏色
  2. banner 按頁滾動
  3. 在沒有手勢的情況下唧龄,2 秒 banner 自動切換
  4. 支持手動滑動切換
  5. 手勢開始觸摸 banner兼砖,停止自動切換
  6. 手勢停止觸摸,開始自動切換
  7. 當前背景顏色 = 當前頁banner對應的背景顏色 + (下一頁banner 對應背景顏色 - 當前頁banner對應的背景顏色)* 下一頁banner相對于父視圖可見區(qū)域的比例
  8. banner 和 banner 的背景顏色都是運營配置并下發(fā)的客戶端的

實現(xiàn)思路

假設有 bannerList 和 bannerBackgroundColorList 兩個列表, bannerList 中裝的是 banner 數(shù)據(jù)既棺,bannerBackgroundColorList 中裝的是每一個 banner 對應的背景顏色數(shù)據(jù),每一個 banner 對應一個 color

NSArray *bannerList = @[banner1, banner2, banner3, banner4];
NSArray *bannerBackgroundColorList = @[color1, color2, color3, color4];

實現(xiàn)ScrollView 的代理讽挟,監(jiān)聽滑動過程,實現(xiàn)如下方法

- (void)scrollDidScroll:(UIScrollView *)scrollView {
    //...
}

取得開始頁和結(jié)束頁背景顏色

取得當前頁


NSInteger startPage = scrollView.contentOffset.x / scrollView.width;
UIColor *startColor = bannerBackgroundColorList[startPage];

取得將要顯示的下一頁

NSInteger nextPage = startPage + 1;
if (nextPage >= bannerBackgroundColorList.count){
    nextPage = 0;
}
UIColor *endColor = bannerBackgroundColorList[nextPage];

取得結(jié)束頁出現(xiàn)的比例丸冕,計算公式如下

p = (scrollView.offset.x%scrollView.width)/scrollView.width

scrollView.offset.x 為滾動視圖的 x 方向的偏移量耽梅,scrollView.width 為滾動視圖的寬度

將取得顏色轉(zhuǎn)換為RGBA色值

如果顏色本身是一個后端傳遞過來的 16 進制色值,則采用下面的方式

/** 提取十六進制字符串中的色值 */
BOOL YSYHexStrToRGBA(NSString *str,
                     NSInteger *r, NSInteger *g, NSInteger *b, NSInteger *a) {
    str = [str uppercaseString];
    if ([str hasPrefix:@"#"]) {
        str = [str substringFromIndex:1];
    } else if ([str hasPrefix:@"0X"]) {
        str = [str substringFromIndex:2];
    }
    NSUInteger length = [str length];
    //         RGB            RGBA          RRGGBB        RRGGBBAA
    if (length != 3 && length != 4 && length != 6 && length != 8) {
        return NO;
    }
    //RGB,RGBA,RRGGBB,RRGGBBAA
    if (length < 5) {
        *r = YSYHexStrToInt([str substringWithRange:NSMakeRange(0, 1)]);
        *g = YSYHexStrToInt([str substringWithRange:NSMakeRange(1, 1)]);
        *b = YSYHexStrToInt([str substringWithRange:NSMakeRange(2, 1)]);
        if (length == 4){
            *a = YSYHexStrToInt([str substringWithRange:NSMakeRange(3, 1)]);
        } else {
            *a = 255;
        }
    } else {
        *r = YSYHexStrToInt([str substringWithRange:NSMakeRange(0, 2)]);
        *g = YSYHexStrToInt([str substringWithRange:NSMakeRange(2, 2)]);
        *b = YSYHexStrToInt([str substringWithRange:NSMakeRange(4, 2)]);
        if (length == 8) {
            *a = YSYHexStrToInt([str substringWithRange:NSMakeRange(6, 2)]);
        } else {
            *a = 255;
        }
    }
    return YES;
}

如果顏色是一個 UIColor 類型的對象則采用 UIColor 類提供的方法

- (BOOL)getRed:(CGFloat *)R green: (CGFloat *)G blue:(CGFloat *)B alpha:(CGFloat *)A

這里假設bannerBackgroundColorList 里的元素 UIColor 類型的

CGFloat startR,startG,startB,startA,endR,endG,endB,endA;

[startColor getRed:&startR green:&startG blue:&startB alpha:&startA];
[endColor getRed:&endR green:&endG blue:&endB alpha:&endA];

計算最終色值

R = startR + (endR - starR) * p;
G = startG + (endG - starG) * p;
B = startB + (endB - starB) * p;
A = startA + (endA - starA) * p;

將計算出來的色值轉(zhuǎn)換為顏色胖烛,得到 banner 背景當前要顯示的顏色

UIColor *currentColor = [UIColor colorWithRed:R green:G blue:B alpha:A];

總結(jié)

  • 為了方便 banner 切換我這里使用 GitHub 開源庫 SDCycleScrollView褐墅,挺好用的
  • 技術(shù)要點就是取兩個顏色的中間顏色,顏色由R洪己、G妥凳、B、A構(gòu)成(準確一點來說是由 R答捕、G逝钥、B 三色值構(gòu)成),取中間顏色拱镐,也就是對開始顏色的RGBA值跟結(jié)束顏色的RGBA值進行運算得到最終的RGBA色值艘款,將色值再轉(zhuǎn)換為顏色

最終效果

最終效果.gif

Demo地址:https://github.com/muxueChen/MXSlideShow

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沃琅,隨后出現(xiàn)的幾起案子哗咆,更是在濱河造成了極大的恐慌,老刑警劉巖益眉,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌柬,死亡現(xiàn)場離奇詭異姥份,居然都是意外死亡,警方通過查閱死者的電腦和手機年碘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門澈歉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屿衅,你說我怎么就攤上這事埃难。” “怎么了涤久?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵涡尘,是天一觀的道長。 經(jīng)常有香客問我响迂,道長考抄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任栓拜,我火速辦了婚禮座泳,結(jié)果婚禮上惠昔,老公的妹妹穿的比我還像新娘幕与。我一直安慰自己,他們只是感情好镇防,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布啦鸣。 她就那樣靜靜地躺著,像睡著了一般来氧。 火紅的嫁衣襯著肌膚如雪诫给。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天啦扬,我揣著相機與錄音中狂,去河邊找鬼。 笑死扑毡,一個胖子當著我的面吹牛胃榕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞄摊,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勋又,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了换帜?” 一聲冷哼從身側(cè)響起楔壤,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惯驼,沒想到半個月后蹲嚣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递瑰,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡或链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年骇扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齿风。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡禾蚕,死狀恐怖您朽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情换淆,我是刑警寧澤哗总,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站倍试,受9級特大地震影響讯屈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜县习,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一涮母、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躁愿,春花似錦叛本、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逸雹,卻和暖如春营搅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梆砸。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工转质, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帖世。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓休蟹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狮暑。 傳聞我的和親對象是個殘疾皇子鸡挠,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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