Android浮窗实现(WindowManager)

本文介绍如何在Android应用中实现可拖动的浮窗功能,包括添加必要的权限、编写布局参数及触摸监听代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浮窗就是当当前页面关闭后,仍能在手机上显示的窗口,像浮在最上层一样,一直存在,一般可跟随手拖动而移动。
加速球就是一个浮窗。
浮窗的大小和形状等都可以自己设定,不是一定的。

效果(屏幕中小方形为浮窗,可拖动,下面的浮窗按钮与本文无关):

在这里插入图片描述

开启浮窗需要首先开启手机的浮窗权限,有些手机默认不允许开启浮窗:找到manifest下的AndroidManifest.xml文件,在其中添加一句代码,开启权限:

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

开启后可以开始写代码了。

只做浮窗demo,不添加其他功能,直接在activity中进行:
先声明要用到的变量:

//浮窗
    private WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    private static WindowManager windowManager;

    //浮窗内容
    private static ImageView imageView;

然后再onCreat中添加以下代码:

 //浮窗获得service
 windowManager  = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);

 lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;

 lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

 lp.gravity = Gravity.LEFT|Gravity.TOP;  //显示在屏幕左上角

 //显示位置与指定位置的相对位置差
 lp.x = 0;
 lp.y = 0;
 //悬浮窗的宽高
 lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
 lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

 //设置浮窗为透明,如果不设置为透明,图片下面的部分浮窗会为黑色(默认黑,也可能为其他色),不好看
 lp.format = PixelFormat.TRANSPARENT;

 //移除窗口
   if (imageView != null){
   windowManager.removeView(imageView);
    }

  //imageview设置
 imageView = new ImageView(getApplicationContext());
imageView.setImageResource(R.mipmap.ic_launcher);
windowManager.addView(imageView,lp);

  //imageview触摸监听
  imageView.setOnTouchListener(new View.OnTouchListener() {
        private float lastX, lastY;
        private float nowX, nowY;
        private float tranX,tranY;

					         @Override
        	  				 public boolean onTouch(View v, MotionEvent event) {
                          			  	boolean ret = false;
                             			switch (event.getAction()){
		                               //按下
                             		  case MotionEvent.ACTION_DOWN:
                           			    //上次位置
                             		 lastX = event.getRawX();
                              		lastY = event.getRawY();
                             		 ret = true;
                             		  break;
                              		//拖动
                                            case MotionEvent.ACTION_MOVE:
                                             //当前目标位置
                                            nowX = event.getRawX();
                                           nowY = event.getRawY();
                                           tranX = nowX - lastX;
                                          tranY = nowY - lastY;
                                          //移动
                                         lp.x += tranX;
                                         lp.y += tranY;
                                         //更新位置
                                        windowManager.updateViewLayout(imageView,lp);
                                        //记录当前坐标作为下一次计算的上一次移动的位置坐标
                                         lastX = nowX;
                                        lastY = nowY;
                                        break;
                                    //弹起不操作
                                   case MotionEvent.ACTION_UP:
                                    break;
                                   }
                            return ret;
                     }
           });

         Toast.makeText(MainActivity.this,"已开启Toucher",Toast.LENGTH_SHORT).show();

简易的初始在屏幕左上角,大小和图片一样大,可拖动的浮窗完成。

仍在入门,如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值