炫酷的空氣凈化器控件 - AirPurgeLayoutView

  1. 最近把公司智能家具類的應(yīng)用中的一個負(fù)離子凈化顯示的控件重寫了脸狸,干脆就封裝了一下起個高大上的名字空氣凈化器控件最仑,感覺比負(fù)離子凈化牛逼一點,好像最近錘子也發(fā)布了一個空氣凈化器炊甲。
main.png
  1. 再來個動態(tài)的(Gif效果好差沒辦法它限制5M大小了泥彤,真實效果:扇葉是減速運(yùn)動的),還是看后面吧
mode.gif
  1. 一共才寫了幾個篇博客卿啡,沒經(jīng)驗啊吟吝,看了下別人的都寫原理什么的,這次就寫一下里面相當(dāng)比較復(fù)雜的效果的颈娜,其實剑逃,,官辽,蛹磺,沒什么復(fù)雜的,不知道從何說起撿幾個用的到的說同仆。

network1.gif

1. 實現(xiàn)的功能 (注意以思路為主)

  • 1. 改變上中下字體大小萤捆,字體信息
  • 2. 背景顏色實現(xiàn)漸變切換
  • 3. 實現(xiàn)扇葉無縫開啟和關(guān)閉,從上次結(jié)束的位置開始動畫
  • 4. 實現(xiàn)顆粒物效果
  • 5. 無縫改變扇葉的速度
  • 6.實現(xiàn)扇葉的漸變顯示,更加真實

2. 實現(xiàn)扇葉的漸變 (類似于真實扇葉的卷起來效果)

扇葉對比

pan1.png

pan2.png
  1. 簡單說下這個的實現(xiàn)鳖轰,其實實現(xiàn)虛線畫圓真心簡單兩行代碼解決。
// kotlin版 java也是一樣就是設(shè)置一下繪制效果就可以繪制虛線圓
val pathEffect = DashPathEffect(floatArrayOf(mPaint.strokeWidth*0.4f,mPaint.strokeWidth),0f)
mPaint.pathEffect = pathEffect
canvas.drawCircle(dashedRingCx,dashedRingCy,dashedRingRadius,mPaint)
  1. 但是 漸變的怎么繪制呢扶镀?上面的方法就不能用了蕴侣,因為Android繪制漸變的我想到的只有LinearGradient,我說的是一個個繪制漸變臭觉,先說下我的方法昆雀,LinearGradient需要傳入好幾個參數(shù)其中這里比較重要的就是x0,y0,x1,y1,就是你需要從那個點漸變到那個點蝠筑,直接再上個圖標(biāo)就是求出圖中兩個就可以繪制一個漸變的小圓環(huán)了狞膘,然后怎么繪制一個圓弧了。
    pan11.png
// kotlin版 java也是一樣
 //實現(xiàn)漸變扇葉
while (curAngle < 360 - mEachPanAngle) {
            val x0 = measuredWidth/2f + (Math.cos((curAngle)*Math.PI/180)*(dashedRingRadius-dashedRadiusDiff*0.5)).toFloat()
            val y0 = measuredHeight/2f + (Math.sin((curAngle)*Math.PI/180)*(dashedRingRadius-dashedRadiusDiff*0.5)).toFloat()

            val x1 = measuredWidth/2f + (Math.cos((curAngle+mEachPanAngle)*Math.PI/180)*(dashedRingRadius+dashedRadiusDiff*0.5)).toFloat()
            val y1 = measuredHeight/2f + (Math.sin((curAngle+mEachPanAngle)*Math.PI/180)*(dashedRingRadius+dashedRadiusDiff*0.5)).toFloat()

            val shader = LinearGradient(x0, y0, x1, y1, Color.parseColor("#22ffffff"), Color.parseColor("#ffffffff"), Shader.TileMode.CLAMP)
            mPaint.shader = shader
            canvas?.drawArc(rectF, curAngle, mEachPanAngle, false, mPaint)
            curAngle = curAngle + mEachPanAngle + mEachPanAngleGap
}
mPaint.shader = null //記得清除

3. 實現(xiàn)的漸變背景

這個的實現(xiàn)方法就很多了可以直接屬性動畫一個起始值一個結(jié)束值什乙,設(shè)置animator.setEvaluator(ArgbEvaluator())挽封,還有一個就是使用Hsv 使顏色漸變更適合人類觀感,公式就不寫臣镣,網(wǎng)上有源碼里也有辅愿。

4. 實現(xiàn)扇葉無縫開啟和關(guān)閉

這個動畫還是使用屬性動畫,但注意每次開啟和關(guān)閉時傳入的值忆某,當(dāng)前值為起始值点待,結(jié)束值為你要到的值,代碼其實很簡單。


airpurge.gif

private fun onFanAnim(isOpenFan: Boolean) {
       if (mJumpAnimator != null && mJumpAnimator!!.isRunning) {
           mJumpAnimator!!.cancel()
       }
       if (isOpenFan) {
           mJumpAnimator = ObjectAnimator.ofFloat(this,"dashedRadiusDiff",dashedRadiusDiff,mDashedRingWidth)
           mJumpAnimator!!.interpolator = DecelerateInterpolator()
           mJumpAnimator!!.addListener(object : Animator.AnimatorListener{
               override fun onAnimationRepeat(p0: Animator?) {
               }
               override fun onAnimationEnd(p0: Animator?) {
                   if (!isCancelJumpAnim) {
                       mPanListener?.onHasOpen()
                       onRotateAnim()
                   }
                   isCancelJumpAnim = false
               }
               override fun onAnimationCancel(p0: Animator?) {
                   isCancelJumpAnim = true
               }
               override fun onAnimationStart(p0: Animator?) {

               }
           })
           mJumpAnimator!!.duration = 2000
       } else {
           mJumpAnimator = ObjectAnimator.ofFloat(this,"dashedRadiusDiff",dashedRadiusDiff,0f)
           mJumpAnimator!!.interpolator = AccelerateInterpolator()
           mJumpAnimator!!.addListener(object : Animator.AnimatorListener{
               override fun onAnimationRepeat(p0: Animator?) {
               }
               override fun onAnimationEnd(p0: Animator?) {
                   if (dashedRadiusDiff == 0f) {
                       mPanListener?.onHasClose()
                   }
               }
               override fun onAnimationCancel(p0: Animator?) {

               }
               override fun onAnimationStart(p0: Animator?) {

               }
           })
           mJumpAnimator!!.duration = 1200
       }
       mJumpAnimator!!.start()
   }

5. 實現(xiàn)顆粒物效果

  • 1.實現(xiàn)顆粒物無方向飄動
  • 2.順時針向圓心運(yùn)動就是實現(xiàn)被設(shè)備吸入效果
granule.gif

這個實現(xiàn)方法非常多我實現(xiàn)方法應(yīng)該是比較簡單的弃舒,但效果不是特別符合空氣效果癞埠,顆粒物實現(xiàn)了兩個效果一個隨機(jī)流動還有一個隨著扇葉漸變到,1.無方向浮動是每次刷新都進(jìn)行加一個隨機(jī) -0.5 ~ 0.5數(shù)字 2.被設(shè)備吸入的效果使用角度增加聋呢,半徑減小是不是很簡單苗踪。

6. 無縫改變扇葉的速度 (GIF效果不太好)

changespeed.gif

這個實現(xiàn)過程更簡單了每次改變動畫的時間但要記住起點是上一次動畫結(jié)束點,終點是結(jié)束點+360

7 .必須人工解釋一下這個GIF效果實現(xiàn)是1.每個進(jìn)度端實現(xiàn)顏色的漸變 2.就是變速了坝冕,當(dāng)數(shù)字比較大的時候轉(zhuǎn)的快點徒探,隨著進(jìn)度減小慢慢減速,最后關(guān)閉設(shè)備效果喂窟,這個圖轉(zhuǎn)快了就和沒轉(zhuǎn)轉(zhuǎn)一樣测暗。

mode.gif

8. 源碼地址

9. GitHub

10. 如果有問題可以提出,我有時間就改進(jìn), 后續(xù)使用過程中有問題磨澡,也會進(jìn)行更新碗啄。。稳摄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稚字,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胆描,老刑警劉巖瘫想,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昌讲,居然都是意外死亡国夜,警方通過查閱死者的電腦和手機(jī)芙贫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門丈莺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來始衅,“玉大人戈锻,你說我怎么就攤上這事赊舶∧睦” “怎么了缘揪?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵博烂,是天一觀的道長证逻。 經(jīng)常有香客問我乐埠,道長,這世上最難降的妖魔是什么瑟曲? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任饮戳,我火速辦了婚禮,結(jié)果婚禮上洞拨,老公的妹妹穿的比我還像新娘扯罐。我一直安慰自己,他們只是感情好烦衣,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布歹河。 她就那樣靜靜地躺著,像睡著了一般花吟。 火紅的嫁衣襯著肌膚如雪秸歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天衅澈,我揣著相機(jī)與錄音键菱,去河邊找鬼。 笑死今布,一個胖子當(dāng)著我的面吹牛经备,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播部默,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侵蒙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了傅蹂?” 一聲冷哼從身側(cè)響起纷闺,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤算凿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犁功,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氓轰,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年浸卦,在試婚紗的時候發(fā)現(xiàn)自己被綠了戒努。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镐躲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侍筛,到底是詐尸還是另有隱情萤皂,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布匣椰,位于F島的核電站裆熙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禽笑。R本人自食惡果不足惜入录,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佳镜。 院中可真熱鬧僚稿,春花似錦、人聲如沸蟀伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊掏。三九已至蠢络,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迟蜜,已是汗流浹背刹孔。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留娜睛,地道東北人髓霞。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像微姊,于是被迫代替她去往敵國和親酸茴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,090評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫兢交、插件薪捍、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評論 4 62
  • (我看書后就愛胡思亂想酪穿,還要寫點東西凳干。倒不是因為非得寫,只是說出來往往被當(dāng)成廢話連篇的神經(jīng)病被济。寫出來好點救赐,修飾一下...
    李小穆閱讀 221評論 3 12
  • 岱說,人無癖不可交也只磷,以其無深情也经磅。癖好即是深情,是我們對于一些物钮追,一些人预厌,一些感受以及所處時間和空間的的認(rèn)真和投...
    隨手一筆閱讀 298評論 0 0
  • 因為組里臨時規(guī)定明后兩周放假,定好了下星期二回家呆十天元媚,于是在這之前論文無論如何也得寫出來了轧叽。剩下兩天,要寫一...
    lxt閱讀 273評論 0 1