Android懸浮窗自由移動實現
網上很多這方面的文章,但總有諸多問題。主要有:一、懸浮窗移動手指離開后,再次移動時,懸浮窗自動回到初始位置開始移動。二、懸浮窗總是不肯老實地呆在手指邊,手指點上去時會有一些不正常的位移。三、把狀態欄的高度默認為25。【不同分辨率的狀態欄會一樣高嗎?】更有甚者,好多直接在兩次相減中把這個值給消掉了。事實上,這個值根本就是不需要設置的。
項目中要用到這個功能,自己研究了一下,貼出關鍵功能代碼。其他代碼請自行問谷歌。
懸浮窗初始化及監聽Touch事件。
wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); wmParams = new WindowManager.LayoutParams(); // 設置LayoutParams(全局變量)相關參數 wmParams.type = LayoutParams.TYPE_PHONE; wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.gravity = Gravity.CENTER; // 調整懸浮窗口至中間 wmParams.x = 0; wmParams.y = 0; // 設置懸浮窗口長寬數據 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.format = PixelFormat.RGBA_8888; wm.addView(view, wmParams); initViewPlace = false; view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!initViewPlace) { initViewPlace = true; //獲取初始位置 mTouchStartX = event.getRawX(); mTouchStartY = event.getRawY(); x = event.getRawX(); y = event.getRawY(); Log.i(TAG, "startX:" + mTouchStartX + "=>startY:" + mTouchStartY); }else { //根據上次手指離開的位置與此次點擊的位置進行初始位置微調 mTouchStartX += (event.getRawX() -x); mTouchStartY += (event.getRawY() - y); } break; case MotionEvent.ACTION_MOVE: // 獲取相對屏幕的坐標,以屏幕左上角為原點 x = event.getRawX(); y = event.getRawY(); updateViewPosition(); break; case MotionEvent.ACTION_UP: break; } return true; } });
更新位置:
private void updateViewPosition() { // 更新浮動窗口位置參數 wmParams.x = (int) (x - mTouchStartX); wmParams.y = (int) (y - mTouchStartY); wm.updateViewLayout(view, wmParams); }
一些變量:
private static int statusBarHeight = 0; WindowManager wm = null; WindowManager.LayoutParams wmParams = null; View view; private float mTouchStartX; private float mTouchStartY; private float x; private float y; private static final String TAG = "FloatService"; boolean initViewPlace = false;
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!