一墓臭、簡介
????????? 在Android的菜鳥路上,學(xué)習(xí)自定義控件氓鄙,掌握了一點(diǎn)東西就想實(shí)踐一下诚隙,這時(shí)候剛好有個需求需要實(shí)現(xiàn)一個簡單轉(zhuǎn)盤的效果,那就動手去嘗試一下赎懦,封裝就...,只當(dāng)做是自己的練習(xí)吧雀鹃。效果圖如下(點(diǎn)擊可以讓箭頭旋轉(zhuǎn)):
二、思路和主要代碼
1励两、圓環(huán)部分的實(shí)現(xiàn)黎茎。先畫一個藍(lán)色的大圓,再畫一個白色的小圓伐蒋,前提是要設(shè)置相同的圓心工三,半徑部分就可以自己去定義。主要代碼:
2先鱼、兩條相交的直線俭正。先讓畫布以圓心為中心點(diǎn)旋轉(zhuǎn)45度,然后再畫兩條互相垂直的直線即可焙畔。代碼如下:
3掸读、畫三角形即圖中的箭頭。因?yàn)檫@三角形是需要轉(zhuǎn)動宏多,所以需要設(shè)置canvas的旋轉(zhuǎn)的角度儿惫,再去畫三角形。一開始設(shè)置三角形是在左邊的伸但,因此先確定三角形的三個頂點(diǎn)肾请,然后在用Path類來畫出三角形,至于旋轉(zhuǎn)其實(shí)就是利用canvas.rotate(degree, width / 2, height / 2);要注意的是旋轉(zhuǎn)的中心點(diǎn)是圓心更胖,就可以讓三角形圍繞白色圓形轉(zhuǎn)動了铛铁。不然就看不到旋轉(zhuǎn)的三角形了隔显。代碼如下:
4、畫文本饵逐。x坐標(biāo)的是很容易確定的括眠,y坐標(biāo)我取的是文本的底部,所以需要使用以下方法來獲取文本的范圍倍权。
之后就是畫出具體的內(nèi)容了掷豺,其它的文本也是類似。
5薄声、設(shè)置控件的點(diǎn)擊事件当船。
(1)判斷點(diǎn)擊是否落在圓環(huán)上。其實(shí)就是點(diǎn)到圓心的距離要大于小園的半徑同時(shí)小于大圓的半徑奸柬,這時(shí)候就能看出之前采用兩個圓組合成圓環(huán)的好處了生年。
(2)判斷點(diǎn)落在哪一個區(qū)域。首先要計(jì)算出兩條直線的表達(dá)式廓奕,要注意的是Android里面的坐標(biāo)系豎直向下方向才是y軸的正方向抱婉。然后根據(jù)它在哪一條直線的上方和哪一條直線的下方等方向來判斷。比如最左邊的區(qū)域其實(shí)就是在傾斜角為45度直線的上方和另外一條直線的下方桌粉,這時(shí)候只需要判斷y值就可以了蒸绩。
(3)計(jì)算三角形要旋轉(zhuǎn)的角度,這個就用暴力法來做铃肯,直接判斷當(dāng)前的位置和要旋轉(zhuǎn)到的位置來設(shè)置它們的角度患亿。暫時(shí)沒想到其它的算法就只好將就了。
(4)使用屬性動畫讓三角形轉(zhuǎn)起來押逼。兩個參數(shù)分別是三角形當(dāng)前的角度和要旋轉(zhuǎn)到的角度步藕,然后在onAnimationUpdate回調(diào)方法里獲取到當(dāng)前的值,最后調(diào)用postInvalidate()方法重新繪圖挑格。
(5)重寫onTouchEvent方法咙冗。
三、總結(jié)漂彤。
這是我學(xué)習(xí)了自定義控件的基礎(chǔ)知識之后的實(shí)踐雾消,算是入門了,當(dāng)然肯定會有很多不足的地方挫望,慢慢來吧立润。我覺得遇到?jīng)]做過的東西,主要就是要有自己的想法媳板,雖然有可能不完美桑腮,但是至少是自己的東西。