用Kotlin畫起仿掌上英雄聯(lián)盟和懂球帝的自定義多邊形戰(zhàn)力圖

大家好,可能今年換了公司過得比較安逸,自己的心情也不算太好树瞭,所以一段時間都沒很好的學習和更新文章。自從最近看了扔物線HenCoder的文章之后同欠,自己感覺自己對很多自定義View和動畫的知識都不太懂,甚至在平時的開發(fā)極少用到,所以自己想好好學習這一塊的知識。之前無意中在公眾號上看到一個仿英雄聯(lián)盟的的七邊形戰(zhàn)力圖栏赴,自己發(fā)現(xiàn)蘑斧,平時我看的好幾個app都有這樣的多邊形戰(zhàn)力圖靖秩,所以覺得可以自己做一個大眾版的出來,適配各個關(guān)于多邊形戰(zhàn)力圖的自定義View竖瘾。下面我們看看效果圖:

掌上英雄聯(lián)盟和懂球帝的效果圖.png

然后再看看我自己寫的自定義View的效果:
我自己寫的View效果圖.png

可以看到其實大致的效果是差不多的沟突,但是有一些小細節(jié)可能需要自己去定制某個條件再處理,細化和潤色捕传,因為我這里是用同樣的方法惠拭,只是設(shè)置的參數(shù)不一樣,所以看上去有些細節(jié)需要再根據(jù)自己是幾邊形再調(diào)整一下。
大家看看我寫的代碼就知道了:
配置代碼.png

只需要短短的代碼就能畫出不同的戰(zhàn)力多邊形职辅。
好的棒呛,那下面我們就來講講這個東西是怎么實現(xiàn)的,老規(guī)矩域携,如果不想聽分析的同學可以直接下載源碼去看看簇秒。源碼下載鏈接
講代碼之前,先給大家講一下畫出這個多邊形的原理秀鞭,對趋观,就是數(shù)學原理,先看看下面的圖:
原理圖.png

用一個正六邊形舉例锋边,假設(shè)說它每個角到坐標原點為半徑X皱坛,那么我們用數(shù)學的原理XcosA就能得出得出B點的X軸坐標,XsinA能得出B點的Y軸坐標豆巨,由此我們看出來B(XcosA剩辟,XsinA),至于∠A的度數(shù)怎么來的就更簡單了往扔,正n邊形360°/ n抹沪,即 2π/n 就能得到一個角是多少度的了。那很自然而然的瓤球,我們用一個for循環(huán)就可以得出六邊形所有的坐標點

for (i in 0..count - 1) {
      //每個坐標點
      (radius * cos(2 * Math.PI / count * i)).toFloat(), (radius * sin(2 * Math.PI / count * i)).toFloat())
 }

以上就是多邊形戰(zhàn)力圖的數(shù)學原理融欧,應(yīng)該很簡單吧。其實很多自定義View也是一樣卦羡,只要懂了原理噪馏,很多東西很自然而然很簡單的就能寫出來。生活上很多事情也是一樣绿饵,沒做之前什么事情都想著自己做不好就放棄了欠肾,但是自己嘗試了發(fā)現(xiàn)原來這個事情原來那么簡單,我每次寫自定義View總有這個感慨拟赊。
不吹什么了刺桃,確實畢業(yè)一年多工作兩年最近感慨有點。好了吸祟,下面我們來看看代碼我是怎么一步步實現(xiàn)的吧瑟慈。在實現(xiàn)代碼之前,我先說這個View我是用kotlin寫的屋匕,最近也慢慢用kotlin寫代碼寫項目葛碧。一開始確實很不習慣,速度很慢过吻,但是我覺得我總會熟能生巧的吧进泼,所以貴在堅持嘛。
下面我們以懂球帝的六邊形戰(zhàn)力圖為例一步步畫出想要的效果吧:

一、首先我們需要畫出一個多邊形乳绕,和嵌套的多個多邊形绞惦。

首先我們需要畫出一個多邊形,和嵌套的多個多邊形.png

代碼很簡單洋措,我們看看紅色框里面的代碼就是最核心的部分翩隧,一個for循環(huán),剛剛講原理的時候也說過呻纹。那下面詳細分析一下堆生,當i=0的時候,我們把path移動到我們的第一個點上雷酪,

path.moveTo((radius * cos(2 * Math.PI / count * i - Math.PI / 2)).toFloat(), (radius * sin(2 * Math.PI / count * i - Math.PI / 2)).toFloat())

當i>0的時候淑仆,我們就需要把這些點用路徑直線連起來了,所以用的是lineTo()

path.lineTo((radius * cos(2 * Math.PI / count * i - Math.PI / 2)).toFloat(), (radius * sin(2 * Math.PI / count * i - Math.PI / 2)).toFloat())

有人會問為什么角度最后需要減去π / 2哥力,那是因為我們需要把六邊形旋轉(zhuǎn)一下蔗怠,視覺效果更好。


一個六邊形.png

一個六邊形我們畫出來了吩跋,那么一個六邊形里面多個嵌套的多邊形就能很容易的畫出來了寞射,只需要在第一個for循環(huán)的外面再加一個for循環(huán),每次把半徑都減去一定的值锌钮,那很簡單就畫出來了桥温。在上圖中紅色框框外的代碼做的事情就是去加一個for循環(huán),和給畫筆paint加上一些圖片的填充顏色梁丘,另外還在六邊形描了畫邊侵浸。


多邊形嵌套.png

二、畫六邊形的中心到每個角的角邊:

有人注意到了嗎氛谜,我們在第一個for循環(huán)的時候加了一句代碼:

//把相應(yīng)的點保存到pointList中
points.add(PointF(radius * cos(2 * Math.PI / count * i - Math.PI / 2).toFloat(), radius * sin(2 * Math.PI / count * i - Math.PI / 2).toFloat()))

這句代碼就是把我們所要畫的六邊形的六個點的坐標保存了下來掏觉,為方便我們之后用,而且下面很多地方都用到了值漫,你看澳腹,這里就用到了。


畫角邊.png

我們這里考慮到有些多邊形不需要角邊杨何,所以加了一個判斷酱塔,不需要就設(shè)置false就好了。


畫角邊圖.png

畫完角邊我們就考慮一下多邊形外面的字體了晚吞。

三延旧、畫出字體

畫出字體代碼.png

老實說,這里是我做這個自定義View最難受的地方槽地,因為字體的位置要根據(jù)六邊形每個角慢慢調(diào)整字體的不同的位置,我沒想到更好的辦法處理,暫時只是按照坐標軸的四個象限來稍微調(diào)整了一下位置捌蚊,所以當每個同學有興趣做定制化的時候集畅,需要自己再做一些細節(jié)的字體位置調(diào)整處理。


畫出字體圖.png

畫完六邊形外面的內(nèi)容缅糟,那么我們就要往里看看了吧挺智。

四、畫出分數(shù)區(qū)域及設(shè)置相關(guān)屬性

1.我們要設(shè)置分數(shù)區(qū)域的一些屬性窗宦,另它更好看一點:


設(shè)置分數(shù)區(qū)域?qū)傩?png

2.設(shè)置各個屬性的分數(shù)比例:


設(shè)置各個屬性的分數(shù)比例.png

3.按比例畫出每個區(qū)域的點并連成線:
按比例畫出每個區(qū)域的點并連成線.png

其實這一步跟第一步很類似赦颇,也并沒有什么難點可言。
最后我們來看看最終的效果圖:


最終的效果圖.png

講完多邊形戰(zhàn)力圖的原理代碼赴涵,我們再看看要如何使用:
使用圖.png

關(guān)于使用媒怯,我用了設(shè)計模式的builder模式,即建造者模式來管理整個自定義View的配置髓窜。我把每個屬性都分開做定制化處理扇苞,并連成一條數(shù)據(jù)鏈初始化,然后最后調(diào)用build的方法就可以實現(xiàn)所有方法的配置寄纵,是不是很簡便鳖敷,雖然代碼量多了,但是builder模式對我以后對這個自定義View的修改和擴展非常有好處程拭。
下面講講做這個自定義View在kotlin上遇到的一些小問題:
1.構(gòu)造函數(shù)的編寫跟java有區(qū)別:
構(gòu)造函數(shù)的編寫跟java有區(qū)別.png

有人注意到了嗎定踱,雖然在意思上是一樣的,但是kotlin和java在表達上在構(gòu)造函數(shù)這塊上可有不一樣的地方恃鞋。

2.kotlin的小坑:

誰都知道屋吨,kotlin是不需要在代碼中初始化xml控件的,這一點用過的人都會覺得很方便山宾,但是在這里我踩了一個小坑至扰,看下圖:


kotlin初始化.png

kotlin_xml.png

大家是不是會覺得這段代碼完全沒問題?我一開始也是這么認為的资锰,但是我得到的結(jié)果是敢课。。绷杜。直秆。。


image.png

為什么說我沒有初始化呢鞭盟,明明代碼的編譯成功了圾结,我一開始想不明白為什么,后來經(jīng)過一個師兄的提醒 齿诉,我才發(fā)現(xiàn)我們在聲明的時候筝野,dongqiudiPolygonView指向的只是一個int類型的數(shù)字晌姚,但是如果你想用他的build方法,你還是要老老實實的加上一句
dongqiudiPolygonView = findViewById(R.id.dongqiudiPolygonView)

findViewById.png

哎歇竟,坑啊挥唠,所以說探索還是需要有點代價的,下次就不會再犯這種低級錯誤了焕议。
好了宝磨,這一期就講得差不多了,如果對我的代碼有什么建議的同學可以跟我討論一下盅安,譬如說很多kotlin的問題我自己都沒搞得懂~對我的項目有興趣的同學可以下載我的源碼一起學習和交流唤锉,共同進步!源碼下載鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末别瞭,一起剝皮案震驚了整個濱河市窿祥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畜隶,老刑警劉巖壁肋,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異籽慢,居然都是意外死亡浸遗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門箱亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跛锌,“玉大人,你說我怎么就攤上這事届惋∷杳保” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵脑豹,是天一觀的道長郑藏。 經(jīng)常有香客問我,道長瘩欺,這世上最難降的妖魔是什么必盖? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮俱饿,結(jié)果婚禮上歌粥,老公的妹妹穿的比我還像新娘。我一直安慰自己拍埠,他們只是感情好失驶,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枣购,像睡著了一般嬉探。 火紅的嫁衣襯著肌膚如雪擦耀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天甲馋,我揣著相機與錄音埂奈,去河邊找鬼迄损。 笑死定躏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芹敌。 我是一名探鬼主播痊远,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氏捞!你這毒婦竟也來了碧聪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤液茎,失蹤者是張志新(化名)和其女友劉穎逞姿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捆等,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡滞造,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栋烤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒养。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖明郭,靈堂內(nèi)的尸體忽然破棺而出买窟,到底是詐尸還是另有隱情,我是刑警寧澤薯定,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布始绍,位于F島的核電站,受9級特大地震影響话侄,放射性物質(zhì)發(fā)生泄漏亏推。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一满葛、第九天 我趴在偏房一處隱蔽的房頂上張望径簿。 院中可真熱鬧,春花似錦嘀韧、人聲如沸篇亭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译蒂。三九已至曼月,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柔昼,已是汗流浹背哑芹。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捕透,地道東北人聪姿。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像乙嘀,于是被迫代替她去往敵國和親末购。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345