溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android鍵盤面板沖突及布局閃動(dòng)的處理方法

發(fā)布時(shí)間:2021-11-26 17:16:28 來源:億速云 閱讀:443 作者:柒染 欄目:移動(dòng)開發(fā)

Android鍵盤面板沖突及布局閃動(dòng)的處理方法,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

這次主要是根據(jù)核心思想的實(shí)踐,實(shí)踐原理是通過CustomRootLayout布局變化,來獲知是否是鍵盤引起的真正的布局變化,進(jìn)而處理到接下來PanelLayout的onMersure中。

  • 新算法不再動(dòng)態(tài)修改View#LayoutParams,而是更加簡(jiǎn)單明了的方式

  • ***代碼在原基礎(chǔ)上自動(dòng)動(dòng)態(tài)適配面板高度與鍵盤高度等高,很大程度上優(yōu)化了體驗(yàn)。

我們可以看到微信中的 從鍵盤與微信的切換是無縫的,而且是無閃動(dòng)的,這種基礎(chǔ)體驗(yàn)是符合預(yù)期的。

但是實(shí)際中,簡(jiǎn)單的 鍵盤與面板切換 是會(huì)有閃動(dòng),問題的。今天我們就實(shí)踐分析與解決這個(gè)問題。

最終效果對(duì)比:

Android鍵盤面板沖突及布局閃動(dòng)的處理方法

Android鍵盤面板沖突及布局閃動(dòng)的處理方法

I. 準(zhǔn)備

以下建立在android:windowSoftInputMode帶有adjustResize的基礎(chǔ)上。

如圖,為了方便分析,我們分出3個(gè)View:

Android鍵盤面板沖突及布局閃動(dòng)的處理方法

  • CustomRootView: 除去statusBar與ActionBar(ToolBar…balabala)

  • FootRootView: 整個(gè)底部(包括輸入框與底部面板在內(nèi)的整個(gè)View)

  • PanelView: 面板View

整個(gè)處理過程,其實(shí)需要分為兩塊處理:

從PanelView切換到Keybord

現(xiàn)象:  由于顯示Keybord時(shí)直接PanelView#setVisibility(View.GONE),導(dǎo)致會(huì)出現(xiàn)整個(gè)FooterRootView到底部然后又被鍵盤頂起。

符合預(yù)期的應(yīng)該: 直接被鍵盤頂起,不需要到底部再頂起。

從Keybord切換到PanelView

現(xiàn)象:  由于隱藏Keybord時(shí),直接PanelView#setVisibility(View.VISIBLE),導(dǎo)致會(huì)出現(xiàn)整個(gè)FootRootView先被頂?shù)芥I盤上面,然后再隨著鍵盤的動(dòng)畫,下到底部。

符合預(yù)期的應(yīng)該: 隨著鍵盤收下直接切換到底部,而配有被鍵盤頂起的閃動(dòng)。

II. 處理

原理

在真正由Keybord導(dǎo)致布局真正將要變化的時(shí)候,才對(duì)PanelView做出適配。(注意,所有的判斷處理要在Super.onMeasure之前完成判斷)

方法:

通過CustomRootView高度的變化,來保證在Super.onMeasure之前獲得真正的由于鍵盤導(dǎo)致布局將要變化,然后告知PanelView,讓其在Super.onMeasure之前給到有效高度。

需要注意:

1)  在adjustResize模式下,鍵盤彈起會(huì)導(dǎo)致CustomRootView的高度變小,鍵盤收回會(huì)導(dǎo)致CustomRootView的高度變大,反之變小。因此可以通過這個(gè)機(jī)制獲知真正的PanelView將要變化的時(shí)機(jī)。

2) 由于到了onLayout,clipRect的大小已經(jīng)確定了,又要避免不多次調(diào)用onMeasure因此要在Super.onMeasure之前

3) 由于鍵盤收回的時(shí)候,會(huì)觸發(fā)多次measure,如果  不判斷真正的由于鍵盤收回導(dǎo)致布局將要變化,就直接給View#VISIBLE,依然會(huì)有閃動(dòng)的情況。

4) 從Keybord切換到PanelView導(dǎo)致的布局沖突,只有在Keybord正在顯示的時(shí)候。

5) 從PanelView切換到Keybord導(dǎo)致的布局沖突,已經(jīng)在PanelView與CustomRootView中內(nèi)部處理。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI