Android 自定義view 基礎(chǔ)篇(四)

前言

扯來(lái)扯去湖员,前面三篇自定義 View 文章械拍,終于扯完了一些知識(shí)點(diǎn),有些枯燥如庭,所以我也是講下核心點(diǎn)碰煌,沒(méi)有細(xì)分析,主要是讓各位有點(diǎn)印象和了解绅作。這篇終于是實(shí)踐芦圾,敲代碼的了,因?yàn)楣ぷ髟蚨砣希@篇拖的比較久个少,不過(guò)這系列會(huì)一直更新下去的,會(huì)把我工作中用到的自定義 View 也會(huì)加上去眯杏。好了夜焦,回歸正原題,說(shuō)到自定義 View 岂贩,似乎都離不開(kāi)貝塞爾曲線茫经,因此,第一篇實(shí)踐就是與貝塞爾曲線有關(guān)的。

目錄

從0到1Android自定義View(四) 貝塞爾曲線.png

一卸伞、貝塞爾曲線

1抹镊、貝塞爾曲線簡(jiǎn)介

來(lái)看看官方對(duì)神奇的賽貝爾曲線的介紹:貝塞爾曲線于 1962,由法國(guó)工程師皮埃爾·貝塞爾所廣泛發(fā)表荤傲,他運(yùn)用貝塞爾曲線來(lái)為汽車的主體進(jìn)行設(shè)計(jì)垮耳。貝塞爾曲線最初由 Paul de Casteljau 于 1959 年運(yùn)用 de Casteljau 演算法開(kāi)發(fā),以穩(wěn)定數(shù)值的方法求出貝茲曲線遂黍。貝塞爾曲線主要用于二維圖形應(yīng)用程序中的數(shù)學(xué)曲線终佛,曲線由起始點(diǎn),終止點(diǎn)(也稱錨點(diǎn))和控制點(diǎn)組成雾家,通過(guò)調(diào)整控制點(diǎn)铃彰,貝塞爾曲線的形狀會(huì)發(fā)生變化。

看完后是不是一臉蒙蔽榜贴,一句話理解貝塞爾曲線就是:將任意一條曲線轉(zhuǎn)化為精確的數(shù)學(xué)公式豌研。

2、賽貝爾曲線公式

竟然說(shuō)了是將曲線轉(zhuǎn)化為精確的數(shù)學(xué)公式唬党,那么我們來(lái)看下具體的數(shù)學(xué)公式( 注:以下公式中鹃共,B(t) 為 t 時(shí)間下點(diǎn)的坐標(biāo); P0 為起點(diǎn),Pn 為終點(diǎn),Pi 為控制點(diǎn) ):

(1) 一階貝塞爾曲線(線段)

由 P0 至 P1 的連續(xù)點(diǎn)驶拱, 描述的一條線段

一階貝塞爾曲線公式.jpg

一階貝塞爾曲線公式圖.jpg

(2) 二階貝塞爾曲線(拋物線):

由 P0 至 P1 的連續(xù)點(diǎn) Q0霜浴,描述一條線段。

由 P1 至 P2 的連續(xù)點(diǎn) Q1蓝纲,描述一條線段阴孟。

由 Q0 至 Q1 的連續(xù)點(diǎn) B(t),描述一條二次貝塞爾曲線税迷。

二階貝塞爾曲線(拋物線)公式.jpg

二階貝塞爾曲線(拋物線)公式圖.jpg

(3) 三階貝塞爾曲線:

三階貝塞爾曲線公式.jpg

三階貝塞爾曲線公式圖.jpg

3永丝、貝塞爾曲線在 Android 中的應(yīng)用

其實(shí)貝塞爾曲線在 Android 自定義 View 中運(yùn)用還是挺多的,比如

Android 5.0 后下拉刷新的陰影曲線

QQ 消息提醒的小紅點(diǎn)

用于左右滑動(dòng)時(shí)顯示個(gè)數(shù)的點(diǎn)的移動(dòng)動(dòng)畫

水流波動(dòng)效果

一個(gè)彈性效果的抽屜菜單

4箭养、Android Path 類中提供貝塞爾曲線的操作方法

在 Android 開(kāi)發(fā)中慕嚷,要實(shí)現(xiàn)貝塞爾曲線其實(shí)還是很簡(jiǎn)單的,因?yàn)?Android 已經(jīng)給我們提供了相關(guān)接口毕泌,此接口方法在 Path 類中喝检,而關(guān)于 Path 類的講解,前面一篇博客就介紹過(guò)了撼泛。而且通過(guò) Android 的 API 可以知道挠说,貝塞爾曲線從 API1 就開(kāi)始支持了。下面就是賽貝爾曲線對(duì)應(yīng)的 API 方法了愿题。

貝塞爾曲線對(duì)應(yīng)的方法演示動(dòng)畫

一階曲線

(線性曲線)lineTo

一階貝塞爾曲線動(dòng)圖.gif

二階曲線quadTo

二階貝塞爾曲線(拋物線)動(dòng)圖.gif

三階曲線cubicTo

三階貝塞爾曲線動(dòng)圖.gif

四階曲線無(wú)

四階貝塞爾曲線動(dòng)圖.gif

5损俭、通過(guò) de Casteljau 算法繪制貝塞爾曲線

上面提過(guò)蛙奖,Path 類中提供了畫一到三階的貝塞爾曲線的方法,如果我們需要繪制更高階的貝塞爾曲線呢撩炊?我們可以采用德卡斯特里奧算法(De Casteljau’s Algorithm)來(lái)實(shí)現(xiàn)貝塞爾曲線外永。

效果圖:

貝塞爾曲線截屏1.gif

貝塞爾曲線截屏2.gif

貝塞爾曲線截屏3.gif

貝塞爾曲線截屏4.gif

Github 上的代碼:beziercurve

里面主要就一個(gè)類,beziercurve拧咳,這是個(gè)自定義 View 伯顶,BezierCurve里面主要提供了以下的方法:

Methods:

method 方法description 描述

voidstart()開(kāi)始貝塞爾曲線(required)

voidstop()停止貝塞爾曲線(optional)

booleanaddPoint()增加控制點(diǎn)(optional)

booleandelPoint()刪除控制點(diǎn)(optional)

intgetOrder()獲取貝塞爾曲線階數(shù)(optional)

voidsetRate(int rate)設(shè)置移動(dòng)速率(optional)

voidsetTangent(boolean tangent)設(shè)置是否顯示切線(optional)

voidsetLoop(boolean loop)設(shè)置是否循環(huán)(optional)

voidsetOrder(int order)設(shè)置貝塞爾曲線階數(shù)(optional)

最后通過(guò)BezierCurveActivity來(lái)展示。

二骆膝、貝塞爾曲線的應(yīng)用

1.QQ 消息提醒可拖拽紅點(diǎn)

Github 上的項(xiàng)目地址:qqmsgnotify

效果圖:

QQ消息提醒紅點(diǎn).gif

主要是在繪制紅點(diǎn)的時(shí)候運(yùn)用了貝塞爾曲線祭衩,在固定的位置中,拖拽的時(shí)候阅签,有一種粘性的效果掐暮,就是這里運(yùn)用了貝塞爾曲線。

QQ消息提醒紅點(diǎn).png

運(yùn)用:

(1) 在對(duì)應(yīng)的位置創(chuàng)建一個(gè) TextView

(2) 設(shè)置 GooViewListener 監(jiān)聽(tīng)事件就可以了

mTvPoint = (TextView) findViewById(R.id.point_conversation);? ? ? ? mTvPoint.setText("10");? ? ? ? mTvPoint.setTag(10);? ? ? ? GooViewListener listener =newGooViewListener(this, mTvPoint) {@OverridepublicvoidonDisappear(PointF mDragCenter){super.onDisappear(mDragCenter);? ? ? ? ? ? ? ? Toast.makeText(QQMsgNotifyActivity.this,"消失了", Toast.LENGTH_SHORT).show();? ? ? ? ? ? }@OverridepublicvoidonReset(booleanisOutOfRange){super.onReset(isOutOfRange);? ? ? ? ? ? ? ? Toast.makeText(QQMsgNotifyActivity.this,"重置了", Toast.LENGTH_SHORT).show();? ? ? ? ? ? }? ? ? ? };? ? ? ? mTvPoint.setOnTouchListener(listener);

2.Viewpage頁(yè)面引導(dǎo)切換動(dòng)畫

Github 上的項(xiàng)目地址:guideview

效果圖:

ViewPage引導(dǎo)動(dòng)畫.gif

)

其實(shí)這個(gè)例子也是政钟,運(yùn)用貝塞爾曲線也就是在繪制那個(gè)圓形的地方而已路克,其他地方基本不怎么使用貝塞爾曲線。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末养交,一起剝皮案震驚了整個(gè)濱河市精算,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碎连,老刑警劉巖灰羽,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鱼辙,居然都是意外死亡廉嚼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門倒戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怠噪,“玉大人,你說(shuō)我怎么就攤上這事杜跷〗⒒妫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵葱椭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我口四,道長(zhǎng)孵运,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任蔓彩,我火速辦了婚禮治笨,結(jié)果婚禮上驳概,老公的妹妹穿的比我還像新娘。我一直安慰自己旷赖,他們只是感情好顺又,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著等孵,像睡著了一般稚照。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俯萌,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天果录,我揣著相機(jī)與錄音,去河邊找鬼咐熙。 笑死弱恒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棋恼。 我是一名探鬼主播返弹,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爪飘!你這毒婦竟也來(lái)了义起?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悦施,失蹤者是張志新(化名)和其女友劉穎并扇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抡诞,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穷蛹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昼汗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肴熏。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顷窒,靈堂內(nèi)的尸體忽然破棺而出蛙吏,到底是詐尸還是另有隱情,我是刑警寧澤鞋吉,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布鸦做,位于F島的核電站,受9級(jí)特大地震影響谓着,放射性物質(zhì)發(fā)生泄漏泼诱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一赊锚、第九天 我趴在偏房一處隱蔽的房頂上張望治筒。 院中可真熱鬧屉栓,春花似錦、人聲如沸耸袜。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堤框。三九已至域滥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胰锌,已是汗流浹背骗绕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留资昧,地道東北人酬土。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像格带,于是被迫代替她去往敵國(guó)和親撤缴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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