Android實現懸浮窗
iPhone有個很好用的白色圓點,今天就來研究下Android中的懸浮框,這里主要是實現一個快捷鍵的功能,當然也可以在懸浮框中做想做的事!
懸浮窗的實現主要是通過WindowManager實現,當然WindowManager只是一個接口,想了解源碼的同志們可以去看 WindowManagerImpl,懸浮框主要是通過WindowManager中的addView,updateView,removeView實現
WindowManager.LayoutParams這個類用于提供懸浮窗所需的參數
WindowManager.LayoutParams參數說明:
- type 用于確定懸浮窗的類型(window類型,window有三種類型,應用window,子window,系統window,其中懸浮窗中使用的是系統 window),一般使用TYPE_PHONE,表示在所有應用程序之上,狀態欄之下,當然這里還提供了很多類型,TYPE_STATUS_BAR(狀態欄)TYPE_SEARCH_BAR(搜索框)TYPE_SYSTEM_ALERT(系統提示框,例如電量很低時提示)等等,有很多,根據需求去選擇
- flags 用于確定懸浮窗的行為,FLAG_NOT_FOCUSABLE(window不需要獲得焦點,也不需要接收各種輸入事件)FLAG_NOT_TOUCHABLE(不可點擊)FLAG_NOT_TOUCH_MODAL(系統會通過當前window區域以外的單擊事件傳遞給底層的window,當前window區域以內的單擊事件則自己處理)FLAG_SHOW_WHEN_LOCKED(顯示在鎖屏的界面上)等等
- gravity 用于確定懸浮窗的對齊方式
- x 用于確定懸浮窗的橫坐標
- y 用于確定懸浮窗的縱坐標
- width 值用于指定懸浮窗的寬度
- height 值用于指定懸浮窗的高度
了解這些參數基本就能創建一個懸浮框了
private void createFloatView() { mWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE); wmParams = new WindowManager.LayoutParams(); wmParams.type = WindowManager.LayoutParams.TYPE_PHONE; wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = 100; wmParams.y = 100; wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; LayoutInflater inflater = LayoutInflater.from(getApplication()); mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_float_window, null); mWindowManager.addView(mFloatLayout, wmParams); mFloatView = (ImageView) mFloatLayout.findViewById(R.id.img_float_window); mFloatView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2; wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25; mWindowManager.updateViewLayout(mFloatLayout, wmParams); return false; } }); mFloatView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FloatWindowService.this, SearchActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplication().startActivity(intent); } }); }
if (mFloatLayout != null) { mWindowManager.removeView(mFloatLayout); }
以上就是懸浮框的過程,當然使用系統window必須要申請權限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
通過上面這個過程知道了如何通過WindowManager創建懸浮框
下面給你一個Demo,其中有兩個懸浮窗,第一個懸浮窗就是普通的懸浮窗,第二個懸浮窗加了一些判斷,可以直接在app中使用,這個懸浮窗在桌面和你自己的app中顯示
本文由用戶 mync 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!