懸浮窗可以顯示在所有應用程序之上,不管在PC機還是Android設備上都有這個,最常見的是360的“加速球”
來看下在Android設備上的效果
程序的目錄結構如下圖
創建Activity后啟動Service就關閉
package import import import import public MainActivity Activity {
- onCreate(Bundle savedInstanceState) {
- .onCreate(savedInstanceState);
- Intent intent = Intent(MainActivity., FloatService.);
- }
懸浮窗的主要工作放在Service上處理
package import import import import import import import import import import import import import import import import import import import import import /**
- * 懸浮窗Service 該服務會在后台一直運行一個懸浮的透明的窗體
- * @author Administrator
- */ public FloatService Service {
- UPDATE_PIC = ;
- statusBarHeight;
- View view;
- TextView text = ;
- Button hideBtn = ;
- Button updateBtn = ;
- HandlerUI handler = ;
- Thread updateThread = ;
- viewAdded = ;
- viewHide = ;
- WindowManager windowManager;
- WindowManager.LayoutParams layoutParams;
- IBinder onBind(Intent arg0) {
- ;
- onCreate() {
- .onCreate();
- onStart(Intent intent, startId) {
- .onStart(intent, startId);
- System.out.println();
- ;
- refresh();
- onDestroy() {
- .onDestroy();
- * 關閉懸浮窗
- removeView() {
- (viewAdded) {
- ;
- createFloatView() {
- HandlerUI();
- UpdateUI update = UpdateUI();
- Thread(update);
- updateThread.start();
- ).inflate(R.layout.main, );
- .getSystemService(WINDOW_SERVICE);
- * LayoutParams.TYPE_SYSTEM_ERROR:保證該懸浮窗所有View的最上層
- * LayoutParams.FLAG_NOT_FOCUSABLE:該浮動窗不會獲得焦點,但可以獲得拖動
- */ LayoutParams(LayoutParams.WRAP_CONTENT,
- layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
- * 監聽窗體移動事件
- OnTouchListener() {
- [] temp = [] { 0f, 0f };
- onTouch(View v, MotionEvent event) {
- eventaction = event.getAction();
- (eventaction) {
- MotionEvent.ACTION_DOWN:
- ] = event.getX();
- temp[] = event.getY();
- ;
- MotionEvent.ACTION_MOVE:
- refreshView(() (event.getRawX() - temp[]),
- ) (event.getRawY() - temp[]));
- ;
- ;
- }
- OnClickListener() {
- onClick(View v) {
- viewHide = ;
- );
- OnClickListener() {
- onClick(View v) {
- * 刷新懸浮窗
- * @param x
- * @param y
- */ refreshView( x, y) {
- (statusBarHeight == ) {
- Rect();
- refresh();
- * 添加懸浮窗或者更新懸浮窗 如果懸浮窗還沒添加則添加 如果已經添加則更新其位置
- */ refresh() {
- (viewAdded) {
- {
- ;
- * 接受消息和處理消息
- * @author Administrator
- */ HandlerUI Handler {
- HandlerUI() {
- HandlerUI(Looper looper) {
- (looper);
- * 接收消息
- */
- handleMessage(Message msg) {
- (msg.what == UPDATE_PIC) {
- (!viewHide)
- {
- .handleMessage(msg);
- }
- * 更新懸浮窗的信息
- * @author Administrator
- */ UpdateUI Runnable {
- run() {
- (!Thread.currentThread().isInterrupted()) {
- {
- Thread.sleep();
- (InterruptedException e) {
- }
為懸浮窗創建布局文件
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- </>
懸浮窗上的控件就跟Activity上一樣使用
懸浮窗上顯示的一些內存信息,通過工具類:SysInfoUtils.java來讀取
完整的Demo可以從以下地址下載:
http://download.csdn.net/detail/deng0zhaotai/6577395
http://blog.csdn.net/deng0zhaotai/article/details/16827719