//创建创建全局变量类

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

//Activity类

1 public classMyFloatViewActivity extendsActivity{
2
3
4 /** Calledwhentheactivityisfirstcreated. */
5
6 privateWindowManagerwm= null;
7 privateWindowManager.LayoutParamswmParams= null;
8
9 privateMyFloatViewmyFV= null;
10
11
12@Override
13 public voidonCreate(BundlesavedInstanceState){
14 super.onCreate(savedInstanceState);
15setContentView(R.layout.main);
16
18}
19
22 private voidcreateView(){
23myFV= newMyFloatView(getApplicationContext());
24myFV.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 */
34wmParams.type=LayoutParams.TYPE_PHONE; // 设置windowtype
35 wmParams.format=PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
36
37 // 设置Windowflag
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
49wmParams.gravity=Gravity.LEFT|Gravity.TOP; // 调整悬浮窗口至左上角
50 // 以屏幕左上角为原点,设置x、y初始值
51 wmParams.x=0;
52wmParams.y=0;
53
54 // 设置悬浮窗口长宽数据
55 wmParams.width=40;
56wmParams.height=40;
57
58 // 显示myFloatView图像
59 wm.addView(myFV,wmParams);
60
61}
62
63@Override
64 public voidonDestroy(){
65 super.onDestroy();
66 // 在程序退出(Activity销毁)时销毁悬浮窗口
67 wm.removeView(myFV);
68}
69
70@Override
71 protected voidonRestart(){
72 // TODOAuto-generatedmethodstub
73 wm.removeView(myFV);
74 super.onRestart();
75}
76
79@Override
80 protected voidonStop(){
81 // TODOAuto-generatedmethodstub
82 // 创建悬浮窗口
83 createView();
84 super.onStop();
85}

//浮动窗口内容类

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

在androidManifest中设置:

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

更多相关文章

  1. 简单几段代码实现窗口抖动
  2. android属性android:largeHeap
  3. Android属性动画优化
  4. 设置图片缩放方法失效 解决办法设置android:scaleType属性
  5. Android开发窗口实现半透明效果

随机推荐

  1. 成为 Java GC 专家( 4 ): Apache 的 MaxCli
  2. Lucene 五分钟教程
  3. 在 Java 中如何使用 transient
  4. Lambda 表达式的 10 个示例
  5. 什么是 Java 对象分配率
  6. 一个正则式引发的血案
  7. Java 正则表达式教程及示例
  8. Tomcat 单机多实例部署
  9. 谷歌android CTS认证
  10. 20 个设计模式和软件设计面试问题