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" /> 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM