Android 2048

先上個成品圖

成品圖.gif

實現(xiàn):

就倆對象:CardView、GameView

·CardView:卡片類(每個數(shù)字方塊對應(yīng)的對象)

屬性:取值(value)瀑罗,取值如:2,4,8,16....2048? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顏色(color)雏掠,不同的取值有對應(yīng)不同的顏色值(我是通過colorspy一個一個取的==)

方法:同時這個類暴露一個setValue方法來改變方塊的取值。調(diào)用這個方法的同時不僅要改變? ? ? ? ? ? ? ?value的值摧玫,由于value的改變而帶來color的變化绑青,所以需要調(diào)用invalidate方法來重繪這? ? ? ? ? ? ?個View,(PS這里還有個縮放動畫)颅停。

注意: 1)這是一個圓角矩形掠拳。繪制圓角矩形有兩種方法:canvas.drawRoundRect(rectf,? ? ? ? ? ? ? ? ? ? ? ? radius,radius, paint)纸肉、canvas.drawRoundRect(l, t, r, b, rx, ry, paint)柏肪。我使用的是第一? ? ? ? ? ? ? ? 種,因為可以兼容到21以下烦味。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)這次我才發(fā)現(xiàn)自定義View如果要可以wrap_content的話,需要重寫onMeasure方法柏靶。? ? ? ? ? ? ? 哈屎蜓,不要笑我,我之前就知道重寫onDraw辆苔。主要搞清楚MeasureSpec的三種Mode就可? ? ? ? ? ? ? 以了(AT_MOST,EXACTLY和UNSPECIFIED)扼劈。網(wǎng)上有很多文章,我這里不說了哈街佑。

·GameView:游戲主界面

這是一個ViewGroup捍靠,這是我第一自定義ViewGroup吼吼吼。最重要的就是重寫onLayout方法磁携,告訴它每一個子View要擺在哪良风。具體請閱讀hongyang大神的博客之 Android 手把手教您自定義ViewGroup(一)


GameView.jpg

游戲中烟央,我們可以注意到每個卡片移動后,它的背景就顯示出來了(或者說它的位置就空出來了)粮呢。我把這些背景看做是16個值為0的CardView钞艇。這16個背景(或者說空位)的位置是不會變化的。用一個List來維護(hù)這16個背景挺物,每次onLayout的時候飘弧,把它們繪制到對應(yīng)的位置上即可砚著。

再次就是那些可以移動的卡片了赖草,因為它們出現(xiàn)的位置并不固定剪个,而且有的位置可以為空,并且可能不連續(xù)乎折,所以我用一個HashMap來維護(hù)它們侵歇,HashMap的鍵用來存儲它的位置(index),值來存對應(yīng)的CardView坟冲。

onLayout.jpg

接下來溃蔫,我們要重寫onTouchEvent方法來監(jiān)聽它的觸摸事件伟叛,判斷用戶是進(jìn)行的操作是否有效,進(jìn)行了什么操作统刮。具體實現(xiàn)就是在ACTION_DOWN的時候把觸碰點的xy坐標(biāo)記錄下來侥蒙,在ACTION_MOVE的時候和當(dāng)前的的坐標(biāo)進(jìn)行對比。不細(xì)說了学搜。需要注意的是醋旦,只要進(jìn)行了有效的滑動,就會觸發(fā)相關(guān)事件(例如卡片的移動,卡片的合并)咧最,那么這次(到ACTION_UP為止)的觸碰事件就結(jié)束了御雕,繼續(xù)移動是不會再次觸發(fā)的。

在說卡片的移動和合并之前滥搭,再說一個比較簡單的細(xì)節(jié)酸纲。每次移動后都會在隨機(jī)的一個空位中出現(xiàn)一個2或者4。


隨機(jī)數(shù).jpg


最后來說一下卡片的移動和合并瑟匆,其實這一步如果不給卡片的移動加上動畫并不難闽坡。那就先說不加動畫的吧。

用向左移動當(dāng)做例子吧:我們只需要看一行愁溜,其他行循環(huán)處理就行(用i的循環(huán)行)疾嗅。從左向右看(用j來循環(huán)列),會有如下兩種情況:

如果這個位置上(j)的CardView是空的話冕象,我們要從這一行的(j+1)開始去尋找第一個不為空的CardView,讓它移動到j(luò)上代承。j不變渐扮。如果找了一圈沒找到的話论悴,那說明j之后已經(jīng)沒有CardView了, 這個循環(huán)就可以break了墓律。

如果這個位置上的CardView不為空的話膀估,同樣我們要從這一行的(j+1)開始去尋找第一個不為空的CardView,如果它的value和當(dāng)前CardView(j)上的value相同的話耻讽,就把當(dāng)前CardView的值加倍玖像,把找到的位置上的CardView置空。j++齐饮。如果找了一圈沒找到的話捐寥,那說明j之后已經(jīng)沒有CardView了, 這個循環(huán)就可以break了祖驱。

其他三種情況是類似的握恳。我就不多講了。其實邏輯并不復(fù)雜捺僻。

加上動畫就麻煩了乡洼。我們知道動畫的執(zhí)行是需要時間的。如果在動畫執(zhí)行期間匕坯,已經(jīng)進(jìn)入了下一次的循環(huán)束昵,就會導(dǎo)致數(shù)據(jù)混亂。我的做法就是添加一個布爾類型的全局變量(isMoveAnimating)葛峻,在動畫執(zhí)行期間它的值是true锹雏,只有它執(zhí)行完成后才回變成false。只有當(dāng)isMoveAnimating為false的時候循環(huán)才能繼續(xù)术奖。但是礁遵,還是以向左移動為例轻绞,它每一行之間動畫的執(zhí)行是不會互相影響的,所以就考慮到把每一行要做的事情抽取出來變?yōu)橐粋€單獨的Thread佣耐,而isMoveAnimating就是每一個Thread的局部變量政勃,不會互相影響。


MoveThread



MoveRunnable
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兼砖,一起剝皮案震驚了整個濱河市奸远,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讽挟,老刑警劉巖懒叛,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戏挡,居然都是意外死亡芍瑞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門褐墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆檬,“玉大人,你說我怎么就攤上這事妥凳【构幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵逝钥,是天一觀的道長屑那。 經(jīng)常有香客問我,道長艘款,這世上最難降的妖魔是什么持际? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮哗咆,結(jié)果婚禮上蜘欲,老公的妹妹穿的比我還像新娘。我一直安慰自己晌柬,他們只是感情好姥份,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著年碘,像睡著了一般澈歉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿衅,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天埃难,我揣著相機(jī)與錄音,去河邊找鬼宵溅。 笑死十籍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悟衩,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栓拜!你這毒婦竟也來了座泳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幕与,失蹤者是張志新(化名)和其女友劉穎挑势,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦鸣,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡潮饱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诫给。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香拉。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖中狂,靈堂內(nèi)的尸體忽然破棺而出凫碌,到底是詐尸還是另有隱情,我是刑警寧澤胃榕,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布盛险,位于F島的核電站,受9級特大地震影響勋又,放射性物質(zhì)發(fā)生泄漏苦掘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一楔壤、第九天 我趴在偏房一處隱蔽的房頂上張望鹤啡。 院中可真熱鬧,春花似錦挺邀、人聲如沸揉忘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泣矛。三九已至,卻和暖如春禾蚕,著一層夾襖步出監(jiān)牢的瞬間您朽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留哗总,地道東北人几颜。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像讯屈,于是被迫代替她去往敵國和親蛋哭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,171評論 25 707
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗涮母。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,766評論 22 665
  • 小游 你以后就不要姓游了 我姓游 你姓游 別人還以為 咱倆是親戚哩 說我游某人 任人唯親 其實咱倆是八竿子 打不著...
    關(guān)中陳鏡閱讀 155評論 0 1
  • 去到糟糕的地方谆趾,曾氣急敗壞得說,沒有下次了叛本。 可是機(jī)緣總是遇到巧合沪蓬,又來了,還不止一次来候。 離別前夕也曾信誓旦旦說跷叉,...
    大蘭大蘭蘭閱讀 246評論 0 0