温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android如何实现悬浮窗全系统版本

发布时间:2021-04-16 09:45:15 来源:亿速云 阅读:174 作者:小新 栏目:移动开发

小编给大家分享一下Android如何实现悬浮窗全系统版本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

悬浮窗是在系统上显示的内容,好像微信视频聊天时的小窗口一样,在退出软件后依然存在的一个窗口,本博客以窗口中放一个button组件为例,简单展示悬浮窗,其中包括了对Android 6.0以下、Android 6.0到Android 8.0、Android 8.0以上版本的处理,下面开始介绍实现方法:

1、MainActivity中的代码

public Button mFloatingButton;    @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);     //初始化view   initView();  }  //初始化view  private void initView() {   mFloatingButton=(Button) findViewById(R.id.floating_btn);   mFloatingButton.setOnClickListener(this);  }    public void startFloatingButtonService(View view) {   Log.e("测试流程", "测试流程");   if (FloatingService_Button.isStarted) {    Log.e("测试流程2", "测试流程2");    return;   }   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断系统版本    if (!Settings.canDrawOverlays(this)) {     Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT);     Log.e("测试流程3", "测试流程3");     startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);    } else {     Log.e("测试流程4", "测试流程4");     startService(new Intent(MainActivity.this, FloatingService_Button.class));    }   } else {    startService(new Intent(MainActivity.this, FloatingService_Button.class));   }    }    @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {   if (requestCode == 0) {    if (!Settings.canDrawOverlays(this)) {     Log.e("测试流程5", "测试流程5");     Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();    } else {     Log.e("测试流程6", "测试流程6");     Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();     startService(new Intent(MainActivity.this, FloatingService_Button.class));    }   }  }    @Override  public void onClick(View v) {   switch (v.getId()){    case R.id.floating_btn :     startFloatingButtonService(v);     break;   }  }

思路简单解释:点击弹出悬浮窗按钮时,获取版本并判断“Build.VERSION.SDK_INT >= Build.VERSION_CODES.M”如果系统版本在6.0以下这不需要请求权限,如果系统版本在6.0以上需要进行权限检测以及请求,获取权限后,弹出悬浮框

2、activity_main.xml代码

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  tools:context="com.example.jack_lin.suspendwindow.MainActivity">    <Button   android:id="@+id/floating_btn"      android:text="@string/floating_btn" />     </LinearLayout>

简单解释:xml中没什么特别东西,线性布局中放一个按钮

3、FloatingService_Button的代码

public static boolean isStarted = false;    private WindowManager windowManager;  private WindowManager.LayoutParams layoutParams;    private Button button;    @Override  public void onCreate() {   super.onCreate();   Log.e("进入服务1", "进入服务1");   isStarted = true;   windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);   layoutParams = new WindowManager.LayoutParams();   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {    layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;   } else {    layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;   }   layoutParams.format = PixelFormat.RGBA_8888;   layoutParams.gravity = Gravity.LEFT | Gravity.TOP;   layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;   layoutParams.width = 500;   layoutParams.height = 100;   layoutParams.x = 300;   layoutParams.y = 300;  }    @Nullable  @Override  public IBinder onBind(Intent intent) {   Log.e("进入服务2", "进入服务2");     return null;  }    @Override  public int onStartCommand(Intent intent, int flags, int startId) {   Log.e("进入服务3", "进入服务3");   showFloatingWindow();   return super.onStartCommand(intent, flags, startId);  }    private void showFloatingWindow() {   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断系统版本    if (Settings.canDrawOverlays(this)) {     button = new Button(getApplicationContext());     button.setText("我是个button窗口");     button.setBackgroundColor(Color.BLUE);     windowManager.addView(button, layoutParams);       button.setOnTouchListener(new FloatingOnTouchListener());    }   } else {    button = new Button(getApplicationContext());    button.setText("我是个button窗口");    button.setBackgroundColor(Color.BLUE);    windowManager.addView(button, layoutParams);      button.setOnTouchListener(new FloatingOnTouchListener());   }  }    private class FloatingOnTouchListener implements View.OnTouchListener {   private int x;   private int y;     @Override   public boolean onTouch(View view, MotionEvent event) {    switch (event.getAction()) {     case MotionEvent.ACTION_DOWN:      x = (int) event.getRawX();      y = (int) event.getRawY();      break;     case MotionEvent.ACTION_MOVE:      int nowX = (int) event.getRawX();      int nowY = (int) event.getRawY();      int movedX = nowX - x;      int movedY = nowY - y;      x = nowX;      y = nowY;      layoutParams.x = layoutParams.x + movedX;      layoutParams.y = layoutParams.y + movedY;      windowManager.updateViewLayout(view, layoutParams);      break;     default:      break;    }    return false;   }  }

思路简单解释:首先获取WindowManager服务,然后定义并设置在window上显示的layoutParams(此处需注意Android 8.0以上版本中LayoutParam里的type变量变为TYPE_APPLICATION_OVERLAY与Android 8.0以下版本LayoutParam里的type变量TYPE_PHONE不一样,需要通过判断系统版本进行区分),然后定义并设置在layoutParams上面显示的Button按钮以及监听事件(此处的监听事件主要是悬浮窗口拖动的监听)最后将设置好的button与layoutParams添加入window中

4、AndroidManifest.xml中权限添加

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

5、效果图

Android如何实现悬浮窗全系统版本

以上是“Android如何实现悬浮窗全系统版本”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI