Android常用控件之懸浮窗(Service實現)


懸浮窗可以顯示在所有應用程序之上,不管在PC機還是Android設備上都有這個,最常見的是360的“加速球”


來看下在Android設備上的效果


程序的目錄結構如下圖


創建Activity后啟動Service就關閉

[java] 

 package import import import import public MainActivity  Activity {  

  •   
  •   
  •       onCreate(Bundle savedInstanceState) {  
  • .onCreate(savedInstanceState);  
  •         Intent intent =  Intent(MainActivity., FloatService.);  
  • }  


懸浮窗的主要工作放在Service上處理

[java] 

 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) {  
  •                       
  • }  


為懸浮窗創建布局文件

[html] 

 <? = =?> < =  

  • =  
  •     =  
  • =   
  •   
  •   
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =   
  •   
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =   
  •   
  •   
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =   
  •   
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =  
  • =  
  •         =   
  • </>  


懸浮窗上的控件就跟Activity上一樣使用

懸浮窗上顯示的一些內存信息,通過工具類:SysInfoUtils.java來讀取


完整的Demo可以從以下地址下載:

http://download.csdn.net/detail/deng0zhaotai/6577395


http://blog.csdn.net/deng0zhaotai/article/details/16827719


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM