Draw 過程系列文章

宜陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
Android 展示之三部曲:
前邊我們已經(jīng)分析了:
這倆最主要的任務(wù)是: 確定View/ViewGroup可繪制的矩形區(qū)域。
接下來將會分析,如何在這給定的區(qū)域內(nèi)繪制想要的圖形。
通過本篇文章,你將了解到:
Android 提供了關(guān)于View最基礎(chǔ)的兩個(gè)類:
然而ViewGroup 并沒有約定其內(nèi)部的子View是如何布局的,是疊加在一起呢?還是橫向擺放、縱向擺放等。同樣的View 也沒有約定其展示的內(nèi)容是啥樣,是矩形、圓形、三角形、一張圖片、一段文字抑或是不規(guī)則的形狀?這些都要我們自己去實(shí)現(xiàn)嗎?
不盡然,值得高興的是Android已經(jīng)考慮到上述需求了,為了開發(fā)方便已經(jīng)預(yù)制了一些常用的ViewGroup、View。
如:
繼承自ViewGroup的子類
繼承自View的子類
雖然以上衍生的View/ViewGroup子類已經(jīng)大大為我們提供了便利,但也僅僅是通用場景下的通用控件,我們想實(shí)現(xiàn)一些較為復(fù)雜的效果,比如波浪形狀進(jìn)度條、會發(fā)光的球體等,這些系統(tǒng)控件就無能為力了,也沒必要去預(yù)制千奇百怪的控件。想要達(dá)到此效果,我們需要自定義View/ViewGroup。
通常來說自定義View/ViewGroup有以下幾種:
3 一般不怎么用,除非布局比較特殊。1、2、4 是我們常用的手段,對于我們常說的"自定義View" 一般指的是 4。
接下來我們來看看 4是怎么實(shí)現(xiàn)的。
在xml里引用MyView
效果如下:
黑色部分為其父布局背景。
紅色矩形+黃色圓形即是MyView繪制的內(nèi)容。
以上是最簡單的自定義View的實(shí)現(xiàn),我們提取重點(diǎn)歸納如下:
由上述Demo可知,我們只需要在重寫的onDraw(xx)方法里繪制想要的圖形即可。
來看看View 默認(rèn)的onDraw(xx)方法:
發(fā)現(xiàn)是個(gè)空實(shí)現(xiàn),因此繼承自View的類必須重寫onDraw(xx)方法才能實(shí)現(xiàn)繪制。該方法傳入?yún)?shù)為:Canvas類型。
Canvas翻譯過來一般叫做畫布,在重寫的onDraw(xx)里拿到Canvas對象后,有了畫布我們還需要一支筆,這只筆即為Paint,翻譯過來一般稱作畫筆。兩者結(jié)合,就可以愉快的作畫(繪制)了。
你可能發(fā)現(xiàn)了,在Demo里調(diào)用
并沒有傳入Paint啊,是不是Paint不是必須的?實(shí)際上調(diào)用該方法后,底層會自動(dòng)生成Paint對象。
可以看到,底層初始化了Paint,并且給其設(shè)置的顏色為在Java層設(shè)置的顏色。
onDraw(xx)比較簡單,開局一個(gè)Canvas,效果全靠畫。
試想,這個(gè)Canvas怎么來的呢,換句話說是誰調(diào)用了onDraw(xx)。發(fā)揮一下聯(lián)想功能,在Measure、Layout 過程有提到過兩者套路很像:
那么Draw過程是否也是如此套路呢?看見了onDraw(xx),那么draw(xx)還遠(yuǎn)嗎?
沒錯(cuò),還真有draw(xx)方法:
可以看出,draw(xx)主要分為兩個(gè)部分:
不管是A分支還是B分支,都進(jìn)行了好幾步的繪制。
通常來說,單一一個(gè)View的層次分為:
后面繪制的可能會遮擋前邊繪制的。
對于一個(gè)ViewGroup來說,層次分為:
來看看A分支標(biāo)注的4個(gè)點(diǎn):
(1)
onDraw(canvas)
前面分析過,對于單一的View,onDraw(xx)是空實(shí)現(xiàn),需要由我們自定義繪制。
而對于ViewGroup,也并沒有具體實(shí)現(xiàn),如果在自定義ViewGroup里重寫onDraw(xx),它會執(zhí)行嗎?默認(rèn)是不會執(zhí)行的,相關(guān)分析請移步:
Android ViewGroup onDraw為什么沒調(diào)用
(2)
dispatchDraw(canvas),來看看在View.java里的實(shí)現(xiàn):
發(fā)現(xiàn)是個(gè)空實(shí)現(xiàn),再看看ViewGroup.java里的實(shí)現(xiàn):
也即是說,對于單一View,因?yàn)闆]有子布局,因此沒必要再分發(fā)Draw,而對于ViewGroup來說,需要觸發(fā)其子布局發(fā)起Draw過程(此過程后續(xù)分析),可以類比事件分發(fā)過程View、ViewGroup的處理。感興趣的請移步:
Android 輸入事件一擼到底之View接盤俠(3)
(3)
OverLay,顧名思義就是"蓋在某個(gè)東西上面",此處是在繪制內(nèi)容之后,繪制前景之前。怎么用呢?
以上是給一個(gè)ViewGroup設(shè)置overLay,效果如下:
你可能發(fā)現(xiàn)了,這和設(shè)置overLay差不多的嘛,實(shí)際還是有差別的。在onDrawForeground(xx)里會重新調(diào)整Drawable的尺寸,該尺寸與View大小一致,之前給Drawable設(shè)置的尺寸會失效。運(yùn)行效果如下:
可以看出,ViewGroup都被前景蓋住了。
再來看看B分支的重點(diǎn):邊緣漸變效果
先來看看TextView 邊緣漸變效果:
加上這倆參數(shù)。
實(shí)際上系統(tǒng)自帶的一些控件也使用了該效果,如NumberPicker、YearPickerView
以上是NumberPicker 的效果,可以看出是垂直方向漸變的。
對于View.java 里的onDraw(xx)、draw(xx),ViewGroup.java里并沒有重寫。
而對于dispatchDraw(xx),在View.java里是空實(shí)現(xiàn)。在ViewGroup.java里發(fā)起對子布局的繪制。
來看看標(biāo)記的2點(diǎn):
(1)
設(shè)置padding的目的是為了讓子布局留出一定的空隙出來,因此當(dāng)設(shè)置了padding后,子布局的canvas需要根據(jù)padding進(jìn)行裁減。判斷標(biāo)記為:
FLAG_CLIP_TO_PADDING 默認(rèn)設(shè)置為true
FLAG_PADDING_NOT_NULL 只要有padding不為0,該標(biāo)記就會打上。
也就是說:只要設(shè)置了padding 不為0,子布局顯示區(qū)域需要裁減。
能不能不讓子布局裁減顯示區(qū)域呢?
答案是可以的。
考慮到一種場景:使用RecyclerView的時(shí)候,我們需要設(shè)置paddingTop = 20px,效果是:RecyclerView Item展示時(shí)離頂部有20px,但是滾動(dòng)的時(shí)候永遠(yuǎn)滾不到頂部,看起來不是那么友好。這就是上述的裁減起作用了,需要將此動(dòng)作禁止。通過設(shè)置:
當(dāng)然也可以在xml里設(shè)置:
(2)
drawChild(xx)
從方法名上看是調(diào)用子布局進(jìn)行繪制。
child.draw(x1,x2,x3)里分兩種情況:
這兩者具體作用與區(qū)別會在下篇文章分析,不管是硬件加速繪制還是軟件加速繪制,最終都會調(diào)用View.draw(xx)方法,該方法上面已經(jīng)分析過。
注意,draw(x1,x2,x3)與draw(xx)并不一樣,不要搞混了。
用圖表示:
View/ViewGroup Draw過程的聯(lián)系:
一般來說,我們通常會自定義View,并且重寫其onDraw(xx)方法,有沒有繪制內(nèi)容的ViewGroup需求呢?
是有的,舉個(gè)例子,大家可以去看看RecyclerView ItemDecoration 的繪制,其中運(yùn)用到了ViewGroup draw(xx)、ViewGroup onDraw(xx) 、View onDraw(xx)繪制的先后順序來實(shí)現(xiàn)分割線,分組頭部懸停等功能的。
本篇文章基于 Android 10.0
Android中的Selector主要是用來改變控件的背景,可以設(shè)置控件不同狀態(tài)下的背景,如按下,焦點(diǎn),無焦點(diǎn),被選中。。。等等
創(chuàng)建selecetor一般放在res的drawable目錄下
右擊drawable目錄,new一個(gè)android xml file
填入文件名,選擇selector
下面開始寫一個(gè)按鍵的按下和正常狀態(tài)下的背景
?xml?version="1.0"?encoding="utf-8"?
selector?xmlns:android=""?
item?android:state_pressed="true"
shape?
solid?android:color="#FF2233"/
/shape
/item
item?
shape?
solid?android:color="#FF6633"/
/shape
/item
/selector
item中state的屬性有如下
android:state_pressed 是否按下,如一個(gè)按鈕觸摸或者點(diǎn)擊。
android:state_focused 是否取得焦點(diǎn),比如用戶選擇了一個(gè)文本框。
android:state_hovered 光標(biāo)是否懸停,通常與focused state相同,它是4.0的新特性
android:state_selected 被選中,它與focus state并不完全一樣,如一個(gè)list view 被選中的時(shí)候,它里面的各個(gè)子組件可能通過方向鍵,被選中了。
android:state_checkable 組件是否能被check。如:RadioButton是可以被check的。
android:state_checked 被checked了,如:一個(gè)RadioButton可以被check了。
android:state_enabled 能夠接受觸摸或者點(diǎn)擊事件
android:state_activated 被激活(這個(gè)麻煩舉個(gè)例子,不是特明白)
android:state_window_focused 應(yīng)用程序是否在前臺,當(dāng)有通知欄被拉下來或者一個(gè)對話框彈出的時(shí)候應(yīng)用程序就不在前臺了
需要注意的是如果有多個(gè)item,那么程序?qū)⒆詣?dòng)從上到下進(jìn)行匹配,最先匹配的將得到應(yīng)用。所以最好把默認(rèn)的放到最后面
用過Eclipse的同志都知道在Eclipse中鼠標(biāo)懸停在一個(gè)變量,類,方法名當(dāng)中,其有文檔注釋的話會彈出一個(gè)提示框出來顯示文檔注釋的內(nèi)容。做Android開發(fā)的小伙伴來說,Android studio作為Google的親兒子更受眾多猿青睞,但是剛從Eclipse投靠過來的兄弟來說會有很大的不習(xí)慣。快捷鍵就是其中之一,已習(xí)慣Eclipse的鼠標(biāo)懸停提示注釋的人來說,在Android studio默認(rèn)不顯示懸停提示,這也是很大的反感(快捷鍵可以是f2,也可是Ctrl+ q顯示。不過這對電腦配置差一點(diǎn)的同志來說也是挺好的)。其實(shí)在Android studio中也可以設(shè)置鼠標(biāo)懸停提示的。setting-General
1、為全面屏設(shè)計(jì)
由于 MIUI 是覆蓋數(shù)億人手機(jī)的操作系統(tǒng),因此 MIUI 的設(shè)計(jì)變革也將是「漸進(jìn)式」的。
此次在 MIUI 10 上,部分原本通過虛擬按鍵操控的功能,都將被手勢操作替代,而為了減少用戶的上手成本,MIUI 設(shè)計(jì)團(tuán)隊(duì)采用了名為「懸浮球」的提示方式來引導(dǎo)用戶,同時(shí)為桌面圖標(biāo)增加了動(dòng)態(tài)效果,以此補(bǔ)充操作中缺少的「確認(rèn)感」。
目前 MIUI 10 已知的手勢包括「上滑退出應(yīng)用」、「從邊緣橫向長距離滑動(dòng)并懸停實(shí)現(xiàn)應(yīng)用切換」等。
在頁面設(shè)計(jì)上,MIUI 10 也應(yīng)用了更多全新元素。比如默認(rèn)主題與圖標(biāo)都得到了更新,多任務(wù)界面采用了「瀑布流」布局,亮度調(diào)節(jié)與音量調(diào)節(jié)面板的觸摸區(qū)域被放大等,在操作邏輯上也得到了一定的簡化。
2、「自然」聲音系統(tǒng)
小米表示,MIUI 10 希望通過 為用戶的耳朵「減負(fù)」。
在新系統(tǒng)中,不少機(jī)械聲效被替換為了大自然的聲音——輸入音取材于木魚敲擊、刪除音取材于沙子;而針對起床鈴聲和倒計(jì)時(shí)工具,MIUI 10 則提供了森林、夏夜、海灘、爐火、細(xì)雨 5 種「白噪音」,還可以根據(jù)天氣的變化自動(dòng)更換設(shè)定。
通過 AI 算法,MIUI 10 據(jù)稱還擁有了智能篩選通知的功能——可以將不必要的通知折疊、通過響鈴次數(shù)上限將多余的鈴聲靜默、并精簡不必要的系統(tǒng)界面音效等。
3、更聰明的「小愛同學(xué)」
全新「小愛同學(xué)」在 MIUI 10 中獲得了「喚醒方式」、「耳語輸入」、「AI 訓(xùn)練」、「駕車模式」、「語音全局搜索」等方面的新技能。
「小愛同學(xué)」現(xiàn)在可以通過「信息助手按鈕」、「長按 Home 鍵」、「長按電源鍵」、「語音喚醒」這 4 種方式喚醒;而為了避免在公共場合使用語音助手的尷尬,「小愛同學(xué)」據(jù)稱可以聽懂用戶更加「輕聲細(xì)語」的命令。
由于每個(gè)人使用語音助手的習(xí)慣不同,這次 MIUI 設(shè)計(jì)團(tuán)隊(duì)還為「小愛同學(xué)」帶來了名為「AI 訓(xùn)練」的新功能,用戶可以為「小愛」設(shè)定特殊交互,或是教她學(xué)會自定義的特殊技能。
使用小愛同學(xué)的一個(gè)典型場景就是駕車。如果用戶開車手忙腳亂時(shí)會很容易發(fā)生危險(xiǎn)。MIUI10 的小愛同學(xué)開創(chuàng)性探索駕車模式,讓你在開車時(shí)替你操作手機(jī)。
在語音助手可實(shí)現(xiàn)的功能上,「小愛同學(xué)」現(xiàn)在也能支持以往更多的第三方應(yīng)用,目前官方公布的支持名單如下:
● 社交類:微信、QQ、微博
● 音樂電臺類:小米音樂、QQ 音樂、酷狗音樂、網(wǎng)易云音樂、蜻蜓 FM、喜馬拉雅
● 視頻類:小米視頻、愛奇藝、騰訊視頻、優(yōu)酷視頻
● 地圖類:高德地圖、百度地圖、騰訊地圖
● 出行類:滴滴出行、摩拜單車、ofo
● 生活服務(wù)類:手機(jī)淘寶、京東、大眾點(diǎn)評、支付寶
● 系統(tǒng)應(yīng)用:便簽、相機(jī)、小米錢包、智能識物、安全中心
4、AI 單攝虛化
MIUI 10 為手機(jī)人像模式帶來了「AI 單攝虛化」功能。官方表示「基于數(shù)十萬張照片訓(xùn)練的深度學(xué)習(xí)算法」,MIUI 10 可以完全依靠算法識別鏡頭所攝人物的邊緣,并完成虛化。
5、AI 預(yù)載入和跟手度優(yōu)化
MIUI 10 新引入的 AI 預(yù)加載功能,據(jù)稱可以根據(jù)用戶使用習(xí)慣,預(yù)判用戶即將使用的應(yīng)用,并在后臺將其預(yù)加載,以此「一定概率」實(shí)現(xiàn) 0 秒應(yīng)用加載時(shí)間。
而在界面跟手度方面,小米宣稱,MIUI 10 在桌面滑動(dòng)、瀏覽照片、瀏覽網(wǎng)頁、瀏覽微信對話等常用場景上「跟手度全面超越安卓各廠商」。
6、圖片的「超清分辨率」優(yōu)化
超清分辨率是 MIUI 10 上新增的探索型實(shí)驗(yàn)室功能,當(dāng)用戶在微信朋友圈或今日頭條中點(diǎn)擊圖片瀏覽大圖時(shí),其 AI 算法會自動(dòng)優(yōu)化高寬均在 100px 至 800px 之間的圖片,將不清晰的圖片處理得更清晰。
7、傳送門 2.0
MIUI 10 搭載的「傳送門 2.0」功能,據(jù)稱在可識別的內(nèi)容上做出了大幅度擴(kuò)展。根據(jù)官方信息,「傳送門 2.0」可識別的屏幕內(nèi)容新增了:
● 國家和行政區(qū)域
● 小說
● 酒店
● 旅游景點(diǎn)
● 動(dòng)植物百科
● 新版火車、飛機(jī)等
而在圖片識別方面,「傳送門 2.0」也將新增以下類目:
● 圖片文字提取
● 名片內(nèi)容
● 植物物種
● 動(dòng)物品種
● 名人面孔
● 中外名畫
● 電影海報(bào)
● 書籍封面
8、閃電連接
當(dāng) MIUI 10 手機(jī)添加一個(gè)新的米家智能設(shè)備時(shí),系統(tǒng)在掃描到待添加的智能設(shè)備后,就自動(dòng)觸發(fā)提示彈窗,點(diǎn)擊后即可完成對設(shè)備的添加。
9、智能家居卡片
MIUI 10 信息助手中新增了智能家居卡片,讓用戶可以在桌面快速操作常用的智能硬件設(shè)備。
10、語音智能場景
MIUI 10 上的「小愛同學(xué)」可以直接啟動(dòng)米家智能場景——用戶對「小愛同學(xué)」說出所設(shè)置的場景名, 就能完成較為復(fù)雜的智能設(shè)備控制。
RecyclerView分組懸浮列表
推薦,個(gè)人感覺這個(gè)很好用
這個(gè)也可以
android:drawable 放一個(gè)drawable資源
android:state_pressed 是否按下,如一個(gè)按鈕觸摸或者點(diǎn)擊。
android:state_focused 是否取得焦點(diǎn),比如用戶選擇了一個(gè)文本框。
android:state_hovered 光標(biāo)是否懸停,通常與focused state相同,它是4.0的新特性
android:state_selected 被選中,它與focus state并不完全一樣,如一個(gè)list view 被選中的時(shí)候,它里面的各個(gè)子組件可能通過方向鍵,被選中了。
android:state_checkable 組件是否能被check。如:RadioButton是可以被check的。
android:state_checked 被checked了,如:一個(gè)RadioButton可以被check了。
android:state_enabled 能夠接受觸摸或者點(diǎn)擊事件
android:state_activated 被激活
android:state_window_focused 應(yīng)用程序是否在前臺,當(dāng)有通知欄被拉下來或者一個(gè)對話框彈出的時(shí)候應(yīng)用程序就不在前臺了
分享名稱:android懸停,手機(jī)懸停技術(shù)
分享URL:http://chinadenli.net/article28/dsijhjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、App開發(fā)、網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)