1. 程式人生 > >Android懸浮窗進階版-上篇(思路篇)

Android懸浮窗進階版-上篇(思路篇)

單位的APP想新增懸浮窗,去網上搜索了一圈。
發現能找到的程式碼,效果都實現了,但使用者體驗並不好。
那麼,最終生產的懸浮窗應該是什麼樣的呢?

  1. 拖拽懸浮窗,需要判斷拖拽距離後才會產生拖拽效果。
  2. 根據懸浮窗在手機螢幕的位置,自動判斷靠邊。
  3. 懸浮窗首次繪製時的螢幕位置能隨意更改。

既然是講思路,那我們就說說以上三點的改進思路吧

1. 判斷拖拽距離
效果:
當用戶拖拽懸浮窗>20畫素(舉例)時,懸浮窗跟隨繪製。
當用戶拖拽懸浮窗<=20畫素(舉例)時,懸浮窗不動。
思路:
根據效果,可直接想到在ontouch事件內加入一個拖拽距離判斷演算法。
那麼拖拽距離判斷演算法需要用到哪些資料呢?
首先,記錄一個拖拽起始座標
其次,設定一個拖拽判斷距離
最後,用每次觸發ontouch時的座標 減去

起始座標,當大於判斷距離我們就認定懸浮窗開始拖拽。
重點:
Params中的gravity引數一定要左上哦
其實在寫拖拽距離判斷演算法時,並不這麼簡單,因為差值有可能是為0也有可能為正數或負數。而且正負數的判斷也有區別。
講道理我對螢幕畫素這類的東西一聽就頭大,當時寫演算法時也是用的最笨的方法,那就是依次記錄座標位置然後手寫計算,現在想想也是很頭大的。
2. 自動判斷靠邊
效果:
當用戶停止拖拽時,此時如果懸浮窗位於螢幕左半邊,懸浮窗自動繪製靠左
當用戶停止拖拽時,此時如果懸浮窗位於螢幕右半邊,懸浮窗自動繪製靠右
思路:
根據效果,可直接想到在ACTION_UP
中寫個判斷演算法。
那麼判斷演算法需要用到哪些資料呢?
首先,獲取手機螢幕的Width
其次,獲取到ACTION_UP時的X軸座標
最後,用X軸座標去和Width的一半比對,小於等於居左,大於居右。
重點:
這個演算法真心不難,但還是那句話
Params中的gravity引數一定要左上哦
順便說下:這裡是可以加入動畫的哦
3. 懸浮窗首次繪製的位置
效果:
通過更改引數可以做到懸浮窗首次繪製時可根據引數繪製在螢幕的不同位置
思路:
根據效果,可直接想到寫一個位置判斷演算法,根據方法引數為LayoutParams(引數類)的x,y賦值。
那麼位置判斷演算法需要用到哪些資料呢?
首先,獲取手機螢幕的Width和Height
其次,設定X軸及Y軸引數
最後,根據X軸,Y軸引數以及螢幕的Width和Height值計算具體的LayoutParams(引數類)的x,y值並賦值。
重點:

Params中的gravity引數一定要左上哦
我們的演算法都是基於gravity引數為左上來編寫的。
雖然Params中的gravity引數可以更改,可一旦更改我們的所有演算法也必將混亂
那麼我們就利用Params.x和Params.y來達到我們想要的目的。