因而內心開始YY:"繼承View重寫onmeasur和onTouchEvent方法,測量window寬高,處理滑動事件*&…@……&&¥!……此處省略一萬字......"
java
so easy,直接開擼!git
一頓操做猛如虎。。。github
可拖動的view就不說了,沒啥可說的,主要是設置位置。最開始我用的是:canvas
setX(x);setY(y);複製代碼
而後滿懷欣喜的點擊了Run....五分鐘之後....運行起來了..如圖👇緩存
按鈕的可活動頁面變成了紅線區域....bash
一頓操做猛如虎,發現本身二百五....問題出來了,那就解決唄。查閱嘗試以後發現layout()方法能夠實現效果且不會偏移👇框架
this.layout(mmkv.decodeInt("left"), mmkv.decodeInt("top")
, mmkv.decodeInt("right"), mmkv.decodeInt("bottom"));複製代碼
哎呀,終於搞定了,so easy~~~然而...當我點擊輸入框的時候我才明白了什麼叫Too young,Too simple!!按鈕拖拽之後,點擊輸入框,發現按鈕回到了初始位置,這就很是尷尬了。ide
如下是軟鍵盤的啓動方式:👇佈局
"stateUnspecified"學習 |
軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。 這個是爲了軟件盤行爲默認的設置。 |
"stateUnchanged" |
軟鍵盤被保持不管它上次是什麼狀態,是否可見或隱藏,當主窗口出如今前面時。 |
"stateHidden" |
當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。 |
"stateAlwaysHidden" |
軟鍵盤老是被隱藏的,當該Activity主窗口獲取焦點時。 |
"stateVisible" |
軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)。 |
"stateAlwaysVisible" |
當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。 |
"adjustUnspecified" |
它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容獲得屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴因而否窗口的內容有任何佈局視圖可以滾動他們的內容。若是有這樣的一個視圖,這個窗口將調整大小,這樣的假設可使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行爲設置。 |
"adjustResize" |
該Activity主窗口老是被調整屏幕的大小以便留出軟鍵盤的空間 |
"adjustPan" |
該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。 |
軟鍵盤彈起致使layout從新測量繪製,因此以前的layout()方法無效了,嘗試去在Manifest清單文件中去更改啓動方式爲 adjustNothing,Run以後發現:👇
按鈕是在拖拽後的位置展現,可是!!我輸入框被遮擋了。。我輸入個東西還須要自備透視???因而乎老老實實撤回了...這個方法不行,那就換個套路實現吧。既然每一次鍵盤彈出和收起,都對view進行了從新的測量和繪製,那麼就從這裏入手好了。首先,view的繪製有三個步驟,onMeasure()、onLayout()和onDraw(),onMeasure方法是對view進行測量,測量完成後onLayout開始對view進行佈局,最後onDraw方法開始繪製。那好,我在onDraw開始繪製view的時候,去對個人按鈕設置一個位置,就是我存在緩存裏的位置,以下:👇
/**
* 每次Draw時,重置view回到mmkv中保存的位置
* @param canvas
*/
@Overrideprotected
void onDraw(Canvas canvas) {
this.layout(mmkv.decodeInt("left"), mmkv.decodeInt("top")
, mmkv.decodeInt("right"), mmkv.decodeInt("bottom"));
}複製代碼
PS:這裏的緩存使用的是Tencent 開源的MMKV框架
如此一來想要的結果基本就實現了,可是這種方法總以爲不是最佳解法,不知道你們還有其餘辦法實現嗎?但願分享共同探討!
以上方法沒有在實際項目中用到,後面改了設計,當軟鍵盤彈出的時候在軟鍵盤之上加一個輸入框,軟鍵盤啓動方式設置爲adjustNothing,出於好奇,就本身琢磨了這個解決方案,因此寫下來作一個記錄。若有不足之處,還但願指出共同窗習進步!下面是代碼的連接,若有須要能夠點擊👇
github.com/GavinCui12/…