Android之浮动小窗口

news/2024/7/8 4:35:29

//创建创建全局变量类

复制代码
 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" /> 


http://www.niftyadmin.cn/n/593948.html

相关文章

java全部小写_使Java字符串全部大写或全部小写。

的toUpperCase()使用默认语言环境的规则转换方法的所有字符的在该字符串为大写的toLowerCase()方法转换所有的在该字符串中的字符使用默认语言环境的规则为小写。示例import java.lang.*;public class StringDemo {public static void main(String[] args) {//将所有大写字母转…

Android利用VideoView实现VideoPlayer

在其他的平台上面可能VideoPlayer开发是一个比较有挑战性的工作&#xff0c;但是在Android上面VideoPlayer的开发&#xff0c;基本上可以做到傻瓜式啦。本文简单对VideoPlayer的开发进行简单的介绍。 在Android系统中&#xff0c;是通过MediaPalyer类播放媒体文件的&#xff08…

对Java多线程技术中所有方法的详细解析

一、run()和start() 这两个方法应该都比较熟悉&#xff0c;把需要并行处理的代码放在run()方法中&#xff0c;start()方法启动线程将自动调用 run()方法&#xff0c;这是由Java的内存机制规定的。并且run()方法必须是public访问权限&#xff0c;返回值类型为void。 二、关键字…

JavaScript的数组知识案例之随机点名器

本次分享JavaScript主要知识点涉及到for循环、if选择结构判断语句、数组的定义、定时器、清除定时器、日期对象的使用。 执行后效果图&#xff1a; 思路&#xff1a; 1.网页结构搭建&#xff1a; HTML 2.网页布局美化&#xff1a; CSS   3.随机功能实现: JavaScript 分析后案…

java web 局部刷新页面_实现Web页面的局部动态更新

本例中实现的是页面中局部动态更新的效果&#xff0c;对应页面的显示效果如图5-5所示&#xff0c;在该页面中实现的相当于商品信息的后台维护页面&#xff0c;在该页面中用户可以动态增加新的品牌信息到数据库中&#xff0c;增加后的品牌信息将会直接在动态表格中进行显示。同时…

android VideoView播放视频,MediaRecorder 录音

1. 在Android系统中&#xff0c;是通过MediaPalyer类播放媒体文件的&#xff08;包括视频和音频&#xff09;。虽然这个类已经比较简单了&#xff0c;但是还需要控制各种状态&#xff0c;对于视频还需要设置输出窗口&#xff0c;还是需要仔细研究的。为了避免这些麻烦事儿&…

android悬浮窗口的实现

当我们在手机上使用360安全卫士时&#xff0c;手机屏幕上时刻都会出现一个小浮动窗口&#xff0c;点击该浮动窗口可跳转到安全卫士的操作界面&#xff0c;而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口)。那么这种不受Activit…

解析测试工程师职业瓶颈

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/csdnblog01.html" frameborder"0" width"728" scrolling"no" height"90"></iframe>解析测试工…