iOS平臺下抽獎程序的設計與實現

先上效果圖

? ? ? ?上來先一個對不起,標題黨了,本來是打算擼一個原生版本的,但是考慮到安全性和可控性,選擇了用h5實現,不然出個什么bug中了十個iphone X,這個鍋太重,背不動。gif圖由于被簡書自動加快,真實效果比較平緩正常。

實現

? ? ? ?九宮格抽獎,后臺返回八個獎品信息,排列順序如圖3-1所示,獲取到獎池數據后,遍歷數組,添加八個獎品圖 + 一個按鈕圖進div

for(var i=length;i<=(allNumber);i++){
  if (i == allNumber) {
    $("#checkDivId").append("<img style='background:#FF8082;width:" + onegiftWidth + "px; height:" + onegiftWidth + "px;border-radius: 8px;' src=" + centerCheckimgSrc + " class='checkAction'></img>");
  }else{
    $("#checkDivId").append("<img style='background:#FFFFFF;width:" + onegiftWidth + "px;height:" + onegiftWidth + "px;border-radius: 8px;' src=" +daysJoyAr[i].url +">" +  "</img>");
  }
}

children = $("#checkDivId").children('img');
width = children.eq(0).width() || 0;
height = children.eq(0).height() || 0;

//元素初始化
$("#checkDivId").css({
  position:'relative',
  width:col * width + (col-1) * spacing,
  height:row * height + (row-1) * spacing
});
children.css({
  position:'absolute'
});
            
if(line == 0){
  initOne();
}else{
  initTwo();
}

//初始化函數
//此時分成4個部分,上、右、下、左
//上: 0  ~  col-1
//右: col ~ col+line
//下: col+line+1 ~ 2*col+line-1
//左: else
//如果只有兩行
//此時分成4個部分,上、右、下、左
            
function initOne(){
    children.each(function(index){
        if(index >=0 && index <= (col-1)){
            $(this).css({
                top:0,
                left: index * width + index * spacing
            });
        }else{
            $(this).css({
                bottom:0,
                right: index%col*width
            });
        }
    });
}

//如果大于兩行
function initTwo(){
    children.each(function(index){
        //col 列數  lin 除去上下兩行的行數 此處為1
        if(index >=0 && index <= (col-1)){   //0~2
            $(this).css({
                top:0,
                left: index * width + index * spacing
            });
        }else if(index >= col && index <= (col+line-1)){ //3~3
            $(this).css({
                top:((index+1-col))*(height+spacing),
                right: 0
            });
        }else if(index >= (col+line) && index <= (2*col+line-1)){ //4~6
            $(this).css({
                bottom:0,
                right:(index-((col+line)))*(width+spacing)
            });
        }else if(index == 7){
            $(this).css({ 
                left:0,
                top:(index-(2*col+line-1))*(height+spacing)
            });
        }else{
            $(this).css({ //中心抽獎按鈕
                left:width + spacing,
                top:width + spacing
            });
        }
    });
}
3-1.png

? ? ? ?考慮到安全問題,抽獎結果肯定是由服務器返還,所以當點擊中間的抽獎按鈕時,調用后臺抽獎接口,返回抽獎結果。假設抽獎轉盤轉動時間為三秒,在三秒內必須拿到中獎獎品,當網絡不順暢,或者后臺程序報錯時,給用戶彈窗,程序異常并強行刷新頁面。
? ? ? ?前端要做的是在拿到結果后讓轉盤停在對應的位置上,這一點是關鍵。簡單的代碼實現如下所示。

//取一個隨機整數模擬后臺接口返回的中獎獎品id
var random = parseInt(10*Math.random());

//遍歷圖3-1中的獎池數組,找到對應中獎的獎品
for (var giftindex = 0;giftindex < checkJoyArr.length;giftindex++) {
  if (checkJoyArr[giftindex].id == random) {
    winlocalIndex = giftindex;//中獎獎品的索引
    memberPrizeId = random;//中獎獎品的id
    break;
    }
}

動畫效果

? ? ? ?轉盤需要經歷 加速--->勻速--->減速--->停止 這四個階段。初始位置從索引為0的獎品開始,調用speedUp()函數,當速度到達某一值時,勻速運動1s,之后減速,減速一圈后,開始找中獎獎品索引,當ix == winlocalIndex時(ix為當前選中的商品索引),動畫結束,彈窗提示用戶中獎。幾個重要的函數如下:

var ix = 0; //初始位置
var stop ;
flg = false; //抽獎是否正在運行
/*
加速度公式
v1 = v0 + a*t;注意加速度的v代表時間
此時的t可以我們自己定義,所以是常量,所以只需要求a的值
*/
//加速
function speedUp(){
  runner(ix);
  if(v <= 120){
    clearTimeout(stop);
    v = 120;
    t = 5.0;                
    uniform(); //跳轉到勻速
  }else{
    t++;
    v = v0 + a*t;                   
    stop = setTimeout(speedUp,v);
  }
}
//勻速
function uniform(){
  stop = setTimeout(uniform,v);
  if(t == time/50){
    clearTimeout(stop);
    t = 0.0;    
    speedDown();//跳轉到減速
  }else{
    t++;
  }
  runner(ix);   
}
//減速
function speedDown(){
  var stop3 = setTimeout(speedDown,v);
  if(v >= 500){
    v = 500;
    if(ix == winlocalIndex){                    
      children.removeClass('on').eq(ix).addClass('on');
      clearTimeout(stop3);
      setTimeout(function(){
        options.end(winlocalIndex);
        flg = false;
      },300)
      winlocalIndex = 20;
      return;
    }
  }else{
    t++;
    v = v - a*t;
  }
  runner(ix);
}
function runner(i){
  children.removeClass('on').eq(ix).addClass('on');
  i++;
  if(i == allNumber){
    ix = 0;
  }else{
    ix = i;
  }
}

? ? ? ?至此幾個重要的地方基本寫完了,功能不難,就是寫的過程中比較煩,特別是布局,分分鐘想哭。由于項目中業務邏輯比這個稍微復雜了一點。有七天一次免費抽獎,用完免費抽獎機會后才扣金幣,右上角的點擊刷新獎池等,所以,過兩天剝離出一個demo來。

結語

? ? ? ?這兩天交接工作,不算太忙,準備好好梳理一下前段時間的幾個h5功能,但是寫的過程中發現,好多東西不知道怎么去描述,接觸h5也已經一年時間,特別是前段時間公司立項了幾個小游戲,研究了一段時間的白鷺引擎,看了兩周混合開發框架weex,也由最開始的抵觸慢慢到接受,技術終究是要為產品服務的。
? ? ? ?還有這周末就要飛重慶了,那個我心心念念的地方,不知道前面等待著我的會是什么,希望工作不會太難找。但行好事,莫問前程,祝我好運。。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容