zoukankan      html  css  js  c++  java
  • Android之浮动小窗口

    //创建创建全局变量类

     1 public class MyApplication extends Application {
     2     
     3     /**
     4      * 创建全局变量
     5      * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量
     6      * 
     7      * 这里使用了在Application中添加数据的方法实现全局变量
     8      * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性
     9      * 
    10      */
    11     private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
    12 
    13     public WindowManager.LayoutParams getMywmParams(){
    14         return wmParams;
    15     }

    //Activity类 

     1 public class MyFloatViewActivity extends Activity {
     2    
     3 
     4     /** Called when the activity is first created. */
     5     
     6     private WindowManager wm=null;
     7     private WindowManager.LayoutParams wmParams=null;
     8     
     9     private MyFloatView myFV=null;
    10 
    11     
    12     @Override
    13     public void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.main);
    16     
    18     }
    19     
    22     private void createView(){
    23         myFV=new MyFloatView(getApplicationContext());
    24         myFV.setImageResource(R.drawable.icon);
    25         //获取WindowManager
    26         wm=(WindowManager)getApplicationContext().getSystemService("window");
    27         //设置LayoutParams(全局变量)相关参数
    28         wmParams = ((MyApplication)getApplication()).getMywmParams();
    29 
    30          /**
    31          *以下都是WindowManager.LayoutParams的相关属性
    32          * 具体用途可参考SDK文档
    33          */
    34         wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
    35         wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明
    36 
    37         //设置Window flag
    38         wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
    39                               | LayoutParams.FLAG_NOT_FOCUSABLE;
    40         /*
    41          * 下面的flags属性的效果形同“锁定”。
    42          * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
    43          wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
    44                                | LayoutParams.FLAG_NOT_FOCUSABLE
    45                                | LayoutParams.FLAG_NOT_TOUCHABLE;
    46         */
    47         
    48         
    49         wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角
    50         //以屏幕左上角为原点,设置x、y初始值
    51         wmParams.x=0;
    52         wmParams.y=0;
    53         
    54         //设置悬浮窗口长宽数据
    55         wmParams.width=40;
    56         wmParams.height=40;
    57     
    58         //显示myFloatView图像
    59         wm.addView(myFV, wmParams);
    60         
    61     }
    62     
    63     @Override
    64     public void onDestroy(){
    65         super.onDestroy();
    66         //在程序退出(Activity销毁)时销毁悬浮窗口
    67         wm.removeView(myFV);
    68     }
    69     
    70     @Override
    71     protected void onRestart() {
    72         // TODO Auto-generated method stub
    73         wm.removeView(myFV);
    74         super.onRestart();
    75     }
    76 
    79     @Override
    80     protected void onStop() {
    81         // TODO Auto-generated method stub
    82         //创建悬浮窗口
    83         createView();
    84         super.onStop();
    85     }  

    //浮动窗口内容类

     1 public class MyFloatView extends ImageView {
     2     private float mTouchStartX;
     3     private float mTouchStartY;
     4     private float x;
     5     private float y;
     6     
     8     private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
     9     
    10     //此wmParams为获取的全局变量,用以保存悬浮窗口的属性
    11     private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();
    12 
    13     public MyFloatView(Context context) {
    14         super(context);        
    15         // TODO Auto-generated constructor stub
    16     }
    17     
    18      @Override
    19      public boolean onTouchEvent(MotionEvent event) {
    20          
    21          //getRawX()获取相对屏幕的坐标,即以屏幕左上角为原点         
    22          x = event.getRawX();   
    23          y = event.getRawY()-25;   //25是系统状态栏的高度
    24          Log.i("currP", "currX"+x+"====currY"+y);
    25          switch (event.getAction()) {
    26             case MotionEvent.ACTION_DOWN:
    27                 //getX()获取相对View的坐标,即以此View左上角为原点
    28                 mTouchStartX =  event.getX(); 
    29                 mTouchStartY =  event.getY();
    30                 
    31                 Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
    32                 
    33                 break;
    34             case MotionEvent.ACTION_MOVE:                
    35                 updateViewPosition();
    36                 break;
    37 
    38             case MotionEvent.ACTION_UP:
    39                 updateViewPosition();
    40                 mTouchStartX=mTouchStartY=0;
    41                 break;
    42             }
    43             return true;
    44         }
    45      
    46      private void updateViewPosition(){
    47         //更新浮动窗口位置参数,x是鼠标在屏幕的位置,mTouchStartX是鼠标在图片的位置
    48         wmParams.x=(int)( x-mTouchStartX);
    49         System.out.println(mTouchStartX);
    50         wmParams.y=(int) (y-mTouchStartY);
    51         wm.updateViewLayout(this, wmParams);
    52         
    53      }
    54 
    55 }

    在androidManifest中设置:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

  • 相关阅读:
    Android中Chronometer 计时器和震动服务控件
    Android中几种常用的话框
    Android通过长按图片设置为壁纸
    Android把图片保存到SQLite中
    激活Win10
    SQL 语句解决实际问题
    在Foxmail邮件客户端登录263企业邮箱
    Visual Studio 安装VS10x CodeMAP
    开发常见问题汇总
    Java笔记:编写第一个Java程序
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/2440808.html
Copyright © 2011-2022 走看看