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