1. 程式人生 > >始終懸浮在Android螢幕的彈窗

始終懸浮在Android螢幕的彈窗

要凌駕所有Activity之上一共就4步,想怎麼搞就怎麼搞,非常靈活.

前提是,這個東西要寫在服務裡,才不會被遮蓋

第一:獲取一個WindowManager,獲取一個屬性params

mWM = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
params = new WindowManager.LayoutParams();

第二:自己填充出一個自定義view

view = View.inflate(getApplicationContext(), R.layout.toast_ui, null
);
第三:給params設定屬性,也就是你想讓你的view具備的額外屬性
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
params.gravity = Gravity.LEFT + Gravity.TOP
; params.x = sp.getInt("lastX", 0); params.y = sp.getInt("lastY", 0); params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

第四步:用WindowManager將你的view和你定義的params結合在一起顯示出來

mWM.addView(view, params);

寫Android程式的時候一般用WindowManager就是去獲得螢幕的寬和高,來佈局一些小的東西。基本上沒有怎麼看他的其他的介面。

這兩天想寫一個簡單的類似於Toast的東西,自定義佈局,突然發現,原來Toast的時間是不能自己定義的,只有兩個固定的時間,分別是2秒和3.5秒。我的需求是自定義顯示的時間,這個顯然不能滿足我的需求。但是它是如何做到顯示一個View凌駕於現有的所有的View之上的呢?

我們Android平臺是一個又一個的Activity組成的,每一個Activity有一個或者多個View構成。所以說,當我們想顯示一個介面的時候,我們首先想到的是建立一個Activity,然後所有的操作在Activity裡面實現,或者是一個Dialog或者Toast。這種方式固然簡單,但是在有些情況下,我們要求的只是簡單的顯示,用Activity顯然是多餘,這個時候,我們如何處理呢?

原來,整個Android的視窗機制是基於一個叫做WindowManager,這個介面可以新增view到螢幕,也可以從螢幕刪除view。它面向的物件一端是螢幕,另一端就是View,直接忽略我們以前的Activity或者Dialog之類的東東。其實我們的Activity或者Diolog底層的實現也是通過WindowManager,這個WindowManager是全域性的,整個系統就是這個唯一的東東。它是顯示View的最底層了。

WindowManager的方法很簡單,基本用到的就三個addView,removeView,updateViewLayout。

而WindowManager.LayoutParams的屬性就多了,非常豐富,具體請檢視SDK文件。

寫一個簡單的程式碼:

1 2 3 4 5 WindowManager mWm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);   Button view = newButton(this);   view.setText("window manager test!");   WindowManager.LayoutParams mParams = newWindowManager.LayoutParams();    mWm.addView(view, mParams);

我們這個button的顯示和當前的執行環境基本上是無關的,當前是什麼activity或者是桌面,使用這個底層的結果給你的程式設計帶來很大的靈活性,但是要注意,顯示出來就要銷燬掉,這個是必須的,銷燬其實就是一個remove。

但是僅僅這麼寫會有個問題,就是view顯示在最上層,但是後面的view無法獲得焦點,當你touch的座標超出上次view的範圍時

1 2 mParams = newWindowManager.LayoutParams();   mWm.updateViewLayout(view, mParams);

需要後面的view獲得焦點時:

1 2 mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;    mWm.updateViewLayout(view, mParams);

下面是比較完整的示例程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class myFloatView extends Activity {   /** Called when the activity is first created. */ @Override   public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);  

相關推薦

常用程式碼整理:Android 常用整理

說明:大部分內容都是參考別的文章,這裡做整理是為了以後的程式設計有實用的模板,可以即需即用。 一、自定義 UI 的 Dialog 程式碼: private void showDialog() {

TDialog的基本使用,輕鬆實現Android任意

TDialog是用於實現Android彈窗的框架 一、先看效果圖 二、程式碼實現 1.在app模組下的build.gradle引入TDialog implementation 'com.timmy.tdialog:tdialog:1.3.1' 2.建立彈

Android許可權影響錄音動畫解決辦法

開發中遇到這樣一個問題。在使用者按住錄音按鈕開始錄音時,有些許可權控制比較嚴格的手機,測試時發現裝了360或者其他安全軟體的時候。使用錄音時就會彈出許可權確認框。但此時由於OnTouch事件已經觸發,錄音的動畫已經執行,在確認完許可權手指離開後,動畫仍然在執行。

android實現的方式彙總

近期公司人事調整,自己也從之前的基礎部門轉到了商業產品部門,整體的業務有了不小的變動,最近閱讀相關業務程式碼的時候,發現商業方向的產品需求較多的涉及android的彈窗,所以自己有必要在這裡做以總結和整理。 !!!最佳應用場景: popupwindow、dialog、di

Android 全域性及點選響應操作

在某些場景下,比如說當我們的應用返回到後臺時,等使用者再次回到應用,要彈出一個框,作為提示,或者還有一些供使用者操作的按鈕。 功能可能比較簡單,純屬做個記錄,實現方式多樣,下面就說說 1.涉及到的頁面都繼承一個BaseActivity,差不多所有的邏輯都在這

Android底部實現

Android底部彈窗 再一次需求中,使用到了底部彈窗,這裡就給大家總結一下,我用到的主要有兩種 基於Dialog實現 基於PopupWindow實現 Dialog方式 老規矩,直接上程式碼: Dialog dialog = new D

始終懸浮Android螢幕

要凌駕所有Activity之上一共就4步,想怎麼搞就怎麼搞,非常靈活. 前提是,這個東西要寫在服務裡,才不會被遮蓋 第一:獲取一個WindowManager,獲取一個屬性params mWM = (WindowManager) getSystemService(Context.WIN

Android進階2之PopupWindow(有點懸浮的感覺)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android鎖屏狀態下點亮螢幕提醒

類似於手機鎖屏狀態下QQ來訊息然後點亮螢幕並彈窗,如圖。 相信QQ的這個功能大家都是很熟悉的了,下面就開始講具體的實現步驟。 一、新建一個Activity並在OnCreate中新增四個標識 @Override protected

WindowManager解析(二)Android懸浮框無法出輸入法的原因和無需許可權顯示懸浮

Android懸浮框無法彈出輸入法 最近要研究懸浮窗方面的東西,遇到一個問題,我的懸浮窗裡面有一個輸入框,但是不彈出輸入法,後來找到一個方法: 在WindowManager的例項獲取方式不對,之前是這樣獲取的: mWindowManager = (Wi

Android 懸浮window dialog

使用getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)設定全域性對話方塊 新增許可權 pu

Android編程入門--底部Dialog

layout splay cti oid dia them color line ani 參考博客:Android實現底部對話框BottomDialog dialog_bottom <?xml version="1.0" encoding="utf-8"?&g

android精選源碼,知乎閱讀瀑布流loading掃描二維碼簡潔的MVP

android精選源碼 瀑布流 知乎閱讀 loading彈窗 掃描二維碼 Android知乎閱讀與網易音樂功能源碼Android用瀑布流展示美女圖片源碼一個簡潔好看的loading彈窗QRCode 掃描二維碼、掃描條形碼、相冊獲取圖片後識別、生...一個Android 輕量級簡單易用的Lo

一種簡潔的懸浮設計

需引入:FontAwesome,用於圖示 效果截圖: CSS: .div1 { position: absolute; right: 16px; top: 10%; z-index: 12; } .div2 { border-radius: 10px 0 0 10p

JQuery 出層,始終顯示在螢幕正中間

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android-實現支付寶支付從底部效果

前言 我們再用支付寶支付的時候,會從底部彈上來一個對話方塊,讓我們選擇支付方式等等,今天我們就來慢慢實現這個功能 效果圖 實現 主介面很簡單,就是一個按鈕,點選後跳到支付詳情的Fragment中 package com.example.hfs.alipayuidemo; impor

Android:使用Activity製作中間

使用Activity製作中間彈窗 前言 使用activity製作彈窗的好處就是,自由發揮的餘地更大了。匆匆的用activity製作了中間彈窗的小demo,沒有重寫activity顯示和消失的動畫,圓角沒有新增。上班太忙了,有空再補上。先看看效果圖吧。希望有人能用得上。 佈

Android常見的及使用方法

轉載自:https://blog.csdn.net/qq_35698774/article/details/79779238 setTitle :為對話方塊設定標題 setIcon :為對話方塊設定圖示 setMessage:為對話方塊設定內容 setView : 給對話方塊設定

Android評論根據輸入法自適應高度

需求分析:當我們點選輸入框時,會調出輸入法軟鍵盤,如果不做處理,PopupWindow評論視窗可能會擠到螢幕最上方,更糟糕的事件是看不到我們的輸入框,連自己輸入什麼內容都看不到,這樣使用者體驗非常差!下面先讓大家看我們做出來的效果圖: 上圖可以看出,輸入法彈出和隱藏,對

Android-AlterDialog對話方塊使用全解析

主要方法: setMessage() 設定對話方塊內容為簡單文字 setItems() 對話款內容為簡單列表項 setSingleChoiceItems() 對話方塊內容為單選列表項