Android 自定義View_第三篇(實(shí)踐篇_儀表盤(pán))

本文出自簡(jiǎn)書(shū):堯沐魏割,如需轉(zhuǎn)載請(qǐng)標(biāo)明出處砌庄,尊重原創(chuàng)謝謝
博客地址:http://www.reibang.com/p/1fe0584e2007
這次實(shí)現(xiàn)的效果是這樣的

GIF.gif

這里要說(shuō)一點(diǎn) 一定要捋清邏輯才能寫(xiě)代碼不然就是白寫(xiě)

需求分析

  • 1 繪制最外面的外圓弧
  • 2 繪制里面的不連續(xù)線的小圓弧
  • 3 繪制中心文字
  • 4 繪制中心文字下面的文字
  • 5 繪制圖片指針
  • 6 繪制外圓弧上面的進(jìn)度點(diǎn)
然后我們開(kāi)始第一步操作

第一步

繪制圓弧需要什么? 是不是需要一個(gè)矩形或者其他重載參數(shù)的補(bǔ)全(實(shí)際上就是矩形)腿准,
然后我們繼續(xù)分析杂穷,這個(gè)矩形是不是應(yīng)該是一個(gè)正方形?因?yàn)槲覀兊膱A弧是一個(gè)正正好好的半圓
所以我們確定下了第一步

 繪制矩形
      RectF mreRectF = new RectF(left, top, right, bottom);
             這里我們要說(shuō)一下矩形的四個(gè)參數(shù)都是什么猜敢,并不是什么頂點(diǎn)坐標(biāo)姑荷,而是他距離屏幕左邊
             以及屏幕右邊的距離。這里要明白
              所以我們定義參數(shù)如下(偽代碼)
               左 = 寬度 / 2  - 半徑
               上 = 高度 / 2 - 半徑
               右 = 寬度 / 2 + 半徑 (因?yàn)槲覀儽旧砭匦尉鸵紦?jù)一部分)
               下 = 高度 / 2 + 半徑 同理
            繪制外圓弧
                canvas.drawArc(mreRectF, 開(kāi)始角度, 要旋轉(zhuǎn)多少角度, 是不是連接中心, 畫(huà)筆);

第二步

2.1
繪制小一點(diǎn)的內(nèi)圓弧锣枝? 我們這里還需要定義一個(gè)矩形么厢拭? 當(dāng)然不要了- -。我們把原來(lái)的矩形減少一點(diǎn)就可以了
所以我們減少的部分就不寫(xiě)了撇叁。
2.2
這里實(shí)際上用到了一個(gè)旋轉(zhuǎn)畫(huà)布的技巧 也就是Canvas 對(duì)于這個(gè)類我以后會(huì)專門(mén)說(shuō)一次供鸠,這次明白怎么用就好
內(nèi)圓弧是什么組成的? 是不是一個(gè)一個(gè)小的線段呢? 所以我們做出第一步! 在最左面繪制出一個(gè)最小的

繪制最左側(cè)線段
     canvas.drawLine(開(kāi)始X,開(kāi)始Y,結(jié)束X,結(jié)束Y,畫(huà)筆);
                  我們一個(gè)一個(gè)來(lái)看陨闹,開(kāi)始X代表的是我們線段開(kāi)始的X坐標(biāo)楞捂,所以就是 外矩形 - NUM(你想要的值)
                                    開(kāi)始Y代表的是我們線段開(kāi)始的Y坐標(biāo)薄坏,所以就是 外矩形的中心Y - NUM
                                    結(jié)束X 我們X坐標(biāo)并沒(méi)有發(fā)生改變,所以還是之前的
                                    結(jié)束Y 只需要把剛才的Y多減少一點(diǎn)就可以延長(zhǎng)長(zhǎng)度了啊寨闹!
                                    線段繪制結(jié)束
旋轉(zhuǎn)畫(huà)布達(dá)到繪制全部線段
                   為什么要旋轉(zhuǎn)畫(huà)布呢? 因?yàn)槲覀冎荒芏c(diǎn)繪制線段胶坠,這里不是很好解釋,但是很好理解
                   我們所有的繪制都在一個(gè)畫(huà)布上面繁堡,我們旋轉(zhuǎn)畫(huà)布 然后在繪制相當(dāng)于什么呢沈善?
                   就相當(dāng)于我們把畫(huà)筆拿起來(lái) 旋轉(zhuǎn)了一下角度 然后我們?cè)瓉?lái)繪制的東西會(huì)透過(guò)畫(huà)布然后印在屏幕上面
                   就暫時(shí)這么理解把,其實(shí)實(shí)際和我說(shuō)的差一點(diǎn)椭蹄,我就不說(shuō)什么名詞了
                       canvas.rotate(每次旋轉(zhuǎn)角度, 中心X, 中心Y);// 以圓中心進(jìn)行旋轉(zhuǎn)
                    旋轉(zhuǎn)多少次闻牡?!绳矩? 其實(shí)就是想旋轉(zhuǎn)的角度 / 每次轉(zhuǎn)多少度
                    for (int i = 0; i < 多少次; i++) {
                             畫(huà)線段
                            旋轉(zhuǎn)畫(huà)布
                     }

第三步

繪制中心文字
     又要涉及到我們基線計(jì)算了罩润,因?yàn)橹灰O(shè)計(jì)繪制文字就要計(jì)算baseline
          想要繪制在中心就要測(cè)量字符串寬度 然后 / 2,中心距離 然后一個(gè)減法 這個(gè)說(shuō)了很多次了
              Y = 矩形的top - bottom 然后 + (Math.abs(fontMetrics.ascent) - fontMetrics.descent) / 2
               老套路了不多說(shuō)

第四步

繪制中心下面文字
原理一樣就是Y的減少(數(shù)值減少)

第五步

繪制圖片指針
這個(gè)有一點(diǎn)麻煩,需要理解一下
因?yàn)槲覀兠看味家{(diào)用invalidate來(lái)重新繪制翼馆,所以我們每次只需要畫(huà)一幀或者說(shuō)他在這一次繪制的時(shí)候應(yīng)該在的位置就好
所以說(shuō)是這樣的
/ /每次改變的度數(shù)  =  我要變到多少 * 我要一共要轉(zhuǎn)幾次 / 整體旋轉(zhuǎn)的度數(shù)
然后 如果我這次旋轉(zhuǎn)的次數(shù)==我要改變的此時(shí) 我這時(shí)候就繪制,當(dāng)然每次都需要旋轉(zhuǎn)畫(huà)布
      for (int i = 0; i < 旋轉(zhuǎn)次數(shù); i++) {
            if (每次改變的度數(shù)==i){
                繪制
            }
            旋轉(zhuǎn)
        }
這里需要好好理解一下

第六步

同上

這篇寫(xiě)了好久割以,因?yàn)樽罱チ诵鹿荆》渴裁词虑樘?- -以后完善一下 代碼就不給了应媚,主要是思路

(一個(gè)想進(jìn)階高級(jí)的工程師 一個(gè)交流群:233138718)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末严沥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子珍特,更是在濱河造成了極大的恐慌祝峻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎筒,死亡現(xiàn)場(chǎng)離奇詭異莱找,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嗜桌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)奥溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人骨宠,你說(shuō)我怎么就攤上這事浮定。” “怎么了层亿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵桦卒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我匿又,道長(zhǎng)方灾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮裕偿,結(jié)果婚禮上洞慎,老公的妹妹穿的比我還像新娘。我一直安慰自己嘿棘,他們只是感情好劲腿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鸟妙,像睡著了一般焦人。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圆仔,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天垃瞧,我揣著相機(jī)與錄音,去河邊找鬼坪郭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脉幢,可吹牛的內(nèi)容都是我干的歪沃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嫌松,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沪曙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起萎羔,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤液走,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贾陷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缘眶,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年髓废,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巷懈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慌洪,死狀恐怖顶燕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冈爹,我是刑警寧澤涌攻,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站频伤,受9級(jí)特大地震影響恳谎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剂买,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一惠爽、第九天 我趴在偏房一處隱蔽的房頂上張望癌蓖。 院中可真熱鬧,春花似錦婚肆、人聲如沸租副。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)用僧。三九已至,卻和暖如春赞咙,著一層夾襖步出監(jiān)牢的瞬間责循,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工攀操, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留院仿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓速和,卻偏偏與公主長(zhǎng)得像歹垫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颠放,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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