• 仿360状态,类流量监控桌面浮动显示


    [android]博客分类:

     

    前两天看到部分音频播放器可以实现在桌面上显示歌词,360那个浮动的桌面提示,想不到怎么实现。然后查了些资料大致了解了下,比想象的简单多了。先看效果图吧。

    白色的字体是我加入进去的,此时是可以允许切换背景的。且按住白色背景可以拖动。

    其实主要就是注册一个view到windowsManager上去,然后对它的参数配置成可显示到桌面上的参数就可以了。

    下面是代码

    activity

    就是简单的一个按钮 layout就不写了

    Java代码 复制代码 收藏代码
    1. package com.cfuture.desktop; 
    2.  
    3. import android.app.Activity; 
    4. import android.content.Intent; 
    5. import android.os.Bundle; 
    6. import android.view.View; 
    7.  
    8. public class AndroidDesktopActivity extends Activity { 
    9.     //一个有只有一个按钮的activity 
    10.     @Override 
    11.     public void onCreate(Bundle savedInstanceState) { 
    12.         super.onCreate(savedInstanceState); 
    13.         setContentView(R.layout.main); 
    14.     } 
    15.     public void funClick(View v){ 
    16.         //按钮被点击 
    17.        this.startService(new Intent(this,Mser.class)); 
    18. // new TableShowView(this).fun(); 如果只是在activity中启动  
    19. // 当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌面的view也会消失 
    20. // 所以这里采用的是启动一个服务,服务中创建我们需要显示到table上的view,并将其注册到windowManager上   
    21.         this.finish(); 
    22.     } 
    package com.cfuture.desktop;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class AndroidDesktopActivity extends Activity {
        //一个有只有一个按钮的activity
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        public void funClick(View v){
            //按钮被点击
           this.startService(new Intent(this,Mser.class));
    // new TableShowView(this).fun(); 如果只是在activity中启动 
    // 当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌面的view也会消失
    // 所以这里采用的是启动一个服务,服务中创建我们需要显示到table上的view,并将其注册到windowManager上  
            this.finish();
        }
    }

    然后是一个服务

    Java代码 复制代码 收藏代码
    1. package com.cfuture.desktop; 
    2.  
    3. import android.app.Service; 
    4. import android.content.Intent; 
    5. import android.os.IBinder; 
    6.  
    7. public class Mser extends Service { 
    8.     //服务 
    9.     //这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service  
    10.      
    11.     @Override 
    12.     public IBinder onBind(Intent intent) { 
    13.         // TODO Auto-generated method stub 
    14.         return null; 
    15.     } 
    16.  
    17.     public void onCreate() { 
    18.   //创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上 
    19.         super.onCreate(); 
    20.         new TableShowView(this).fun(); 
    21.     } 
    22.  
    23.  
    24.     @Override 
    25.     public int onStartCommand(Intent intent, int flags, int startId) { 
    26.         // TODO Auto-generated method stub 
    27.         return super.onStartCommand(intent, flags, startId); 
    28.     } 
    package com.cfuture.desktop;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class Mser extends Service {
        //服务
        //这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service 
        
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
    
        public void onCreate() {
      //创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上
            super.onCreate();
            new TableShowView(this).fun();
        }
    
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // TODO Auto-generated method stub
            return super.onStartCommand(intent, flags, startId);
        }
    }
    

    最后是一个复写的view其实不复写view 也行 总之是能传入context对象就可以的了 不过如果想要实现歌词那种或者可以动态改变内容的 就要复写view分支的类了。

    TableShowView

    Java代码 复制代码 收藏代码
    1. package com.cfuture.desktop; 
    2.  
    3. import android.content.Context; 
    4. import android.view.LayoutInflater; 
    5. import android.view.MotionEvent; 
    6. import android.view.View; 
    7. import android.view.WindowManager; 
    8.  
    9. public class TableShowView extends View { 
    10.   //如果是想显示歌词则继承TextView并复写ondraw方法。 
    11.   //开启一个线程不断的调用ondraw方法去更改你所写的继承自TextView的内容 
    12.   //这里随便写了个集成自view的= =这个不是重点 
    13.      
    14.     Context c; 
    15.     WindowManager mWM;//WindowManager 
    16.     WindowManager.LayoutParams mWMParams;//WindowManager参数 
    17.      
    18.  
    19.     public TableShowView(Context context) { 
    20.         // TODO Auto-generated constructor stub 
    21.         super(context); 
    22.         c = context; 
    23.     } 
    24.  
    25.  
    26.     public void fun() { 
    27.         //设置载入view WindowManager参数 
    28.         mWM = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE); 
    29.         final View win = LayoutInflater.from(c).inflate(R.layout.ctrl_window, 
    30.                 null); 
    31.         //这里是随便载入的一个布局文件 
    32.  
    33.         win.setOnTouchListener(new OnTouchListener() { 
    34.             //触屏监听 
    35.             float lastX, lastY; 
    36.  
    37.             public boolean onTouch(View v, MotionEvent event) { 
    38.                 final int action = event.getAction(); 
    39.  
    40.                 float x = event.getX(); 
    41.                 float y = event.getY(); 
    42.                 if (action == MotionEvent.ACTION_DOWN) { 
    43.                     lastX = x; 
    44.                     lastY = y; 
    45.                 } else if (action == MotionEvent.ACTION_MOVE) { 
    46.                     mWMParams.x += (int) (x - lastX); 
    47.                     mWMParams.y += (int) (y - lastY); 
    48.                     mWM.updateViewLayout(win, mWMParams); 
    49.                 } 
    50.                 return true; 
    51.             } 
    52.         }); 
    53.  
    54.         WindowManager wm = mWM; 
    55.         WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); 
    56.         mWMParams = wmParams; 
    57.         wmParams.type = 2003; // type是关键,这里的2002表示系统级窗口,你也可以试试2003。 
    58.         wmParams.flags = 40;// 这句设置桌面可控 
    59.  
    60.         wmParams.width = 300; 
    61.         wmParams.height = 200; 
    62.  
    63.         wm.addView(win, wmParams);//这句是重点 给WindowManager中丢入刚才设置的值 只有addview后才能显示到页面上去。 
    64.         //注册到WindowManager win是要刚才随便载入的layout,wmParams是刚才设置的WindowManager参数集 
    65.         //效果是将win注册到WindowManager中并且它的参数是wmParams中设置饿 
    66.          
    67.     } 
    68.  
    life is a jounery,yes
  • 相关阅读:
    Markdown 画 UML 图(六)
    Markdown 高级技巧(五)
    Markdown 链接、图片、表格(四)
    16.3Sum Closet
    15.Three Sum
    11.Container With Most Water
    1.Two Sum
    优化学习笔记5
    优化学习笔记4
    优化学习笔记3
  • 原文地址:https://www.cnblogs.com/CaptainLin/p/4384716.html
Copyright © 2020-2023  润新知