成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android View 焦點(diǎn)尋址的來龍去脈 !!!

企業(yè)動(dòng)態(tài)
Android 系統(tǒng)的智能電視,最近兩年基本上越來越火了,而在現(xiàn)在手機(jī) App 開發(fā)中,都是使用觸摸的模式進(jìn)行操作,但是在開發(fā)智能電視 App 的時(shí)候,View 的焦點(diǎn)尋址,就是我們繞不過去的坎。

[[214996]]

一、前言

Android 系統(tǒng)的智能電視,最近兩年基本上越來越火了,而在現(xiàn)在手機(jī) App 開發(fā)中,都是使用觸摸的模式進(jìn)行操作,但是在開發(fā)智能電視 App 的時(shí)候,View 的焦點(diǎn)尋址,就是我們繞不過去的坎。

那么,本文就 View 如何控制 Focus,來分析它背后的實(shí)現(xiàn)邏輯。

二、View 的焦點(diǎn)控制

在 Android 中,是有一套自己的焦點(diǎn)查找的算法,簡單來說,就近原則,就是按方向就近查找下一個(gè)符合條件的 View。

如果我們有對(duì)一個(gè) View 焦點(diǎn)控制的需求,需要對(duì)這個(gè) View 強(qiáng)制指定它上下左右之后的下一個(gè)獲取焦點(diǎn)的 View。可以通過 View 的屬性來控制,只需要在對(duì)應(yīng)方向上設(shè)定我們需要焦點(diǎn)轉(zhuǎn)移的下一個(gè) View 的 ID 即可。

  • android:nextFocusDown:按下的時(shí)候,焦點(diǎn)尋址的 ViewId。
  • android:nextFocusUp:按上的時(shí)候,焦點(diǎn)尋址的 ViewId。
  • android:nextFocusLeft:按左的時(shí)候,焦點(diǎn)尋址的 ViewId。
  • android:nextFocusRight:按右的時(shí)候,焦點(diǎn)尋址的 ViewId。
  • android:nextFocusForward:向前的時(shí)候,焦點(diǎn)尋址的 ViewId。

這些都是最基本的,不是本文的主題。那么如果沒有設(shè)定這些屬性,而 Android 對(duì) View 的 就近原則 的焦點(diǎn)查找算法,到底是如何實(shí)現(xiàn)的呢?

三、View 的焦點(diǎn)尋址

Android 中,是如何做到對(duì) View 焦點(diǎn)的控制呢?

我們就先從 View 的源碼看起,看看它是如何找到“下一個(gè)”位置的 View的,在 View 中,查找下一個(gè)應(yīng)該獲取焦點(diǎn)的 View ,使用的方法是 focusSearch()。

它需要傳遞一個(gè) direction 參數(shù),這個(gè) direction 就是指定獲取什么方向上的下一個(gè)位置的焦點(diǎn)。

而 View 并不會(huì)處理焦點(diǎn)尋址的具體邏輯,而是將焦點(diǎn)的查找委托給 mParent 來實(shí)現(xiàn),mParent 是一個(gè)接口,它的實(shí)現(xiàn)類是 ViewRootImpl。

ViewRootImlp.focusSearch() 最終又將焦點(diǎn)尋址的任務(wù),交托給 FocusFinder 來處理。

findNextFocus()中可以看到,findNextUserSpecifiedFocus() 方法正是用于查找我們對(duì) View 設(shè)定不同方向的下一個(gè)焦點(diǎn)的 ViewId ,它的優(yōu)先級(jí)是***的,如果沒有找到,才會(huì)進(jìn)行 findNextFocus() 通過算法來查找對(duì)應(yīng)的 View。

為了證實(shí)這個(gè)說法,我們先看看 findNextUserSpecifiedFocus()的源碼。

最終,又調(diào)回到 View.findUserSetNextFocus() 方法去尋找。

到這里也證實(shí)了我們的猜測,確實(shí)是通過 direction 來進(jìn)行 View 的焦點(diǎn)尋址。

再回過頭來看看 findNextFocus() 方法,如果通過 findNextUserSpecifiedFocus() 方法沒有找到我們指定的 View,就會(huì)繼續(xù)向下執(zhí)行。這里聲明的一個(gè)局部變量 focusables 就是用于存放符合算法的所有 View 。

接下來再看看如何向 focusables 這個(gè) List 中,添加符合尋址要求的 View。在 findNextFocus() 中可以看到,它最終會(huì)調(diào)用 findNextFocusInAbsoluteDirection() 方法。

從 findNextFocusInAbsoluteDirection() 方法可以看出,就近原則就是在這里實(shí)現(xiàn)的,通過 View 的坐標(biāo)點(diǎn),計(jì)算出***要求的 View ,最終將找到的 View 返回過去。

到這里,基本就追蹤到 View 對(duì)焦點(diǎn)尋址的完整邏輯。***補(bǔ)一個(gè)方法調(diào)用的流程圖。

四、總結(jié)

如果有對(duì) View 焦點(diǎn)的控制,可以考慮通過設(shè)置 View 的屬性,還可以通過重寫 View.focusSearch() 方法,來定制 View 焦點(diǎn)的尋址規(guī)則。不過一般而言,不推薦重寫 focusSearch() 方法,只使用屬性控制也能滿足我們的需求。

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2016-12-12 09:58:47

AndroidAndroid Vie

2021-07-07 11:35:17

Linux內(nèi)存段尋址

2022-06-28 18:32:45

物聯(lián)網(wǎng)IoT

2011-01-26 10:21:30

view類Qt

2009-06-26 08:44:57

2018-01-09 04:59:59

VLANTag網(wǎng)絡(luò)技術(shù)

2021-10-08 07:53:01

Go 尋址元素

2019-10-31 08:36:59

線程內(nèi)存操作系統(tǒng)

2021-05-13 10:12:55

Kubernetes 微服務(wù)軟件開發(fā)

2022-08-02 09:02:17

虛擬內(nèi)存操作系統(tǒng)

2022-06-09 09:20:40

Linux語言編寫代碼

2021-01-19 11:40:40

Linux代碼程序編譯

2009-10-20 14:58:15

Javascript事

2020-04-12 22:23:45

Kubernetes容器網(wǎng)絡(luò)

2020-09-30 06:50:35

Linux內(nèi)存尋址

2018-02-24 13:21:02

2011-08-30 16:26:34

Hadoop

2009-09-16 13:05:32

C#組件開發(fā)

2020-04-15 22:18:55

架構(gòu)負(fù)載均衡分布式

2019-08-02 08:59:21

Token認(rèn)證服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线h | 91xh98hx 在线 国产 | 99久久久久久 | 观看av | а_天堂中文最新版地址 | 不卡在线视频 | www.激情.com| 天天色天天射天天干 | av手机在线播放 | 亚洲a在线观看 | 99热播精品| 亚洲另类自拍 | 玖玖视频免费 | 999久久久精品 | 久久久91精品国产一区二区三区 | 精品国产三级 | 在线一区| 干一干操一操 | 在线看一区二区三区 | 免费一看一级毛片 | 日本免费小视频 | 亚洲在线久久 | 天天干b | 伊人久久大香线 | 国产高清精品一区二区三区 | 91精品国产麻豆 | 精品国产综合 | 影音先锋亚洲资源 | 日韩一区二区免费视频 | 日韩视频在线一区 | 午夜日韩视频 | 在线观看视频亚洲 | 在线观看免费av片 | 91网视频| 精品91| 中文字幕国产 | 国产精品激情 | 午夜免费网站 | 欧美一级大片 | 91精品久久久久久久 | 北条麻妃视频在线观看 |