美文网首页
android 悬浮窗

android 悬浮窗

作者: 迷路的骆驼 | 来源:发表于2017-09-12 15:39 被阅读573次

    安卓悬浮窗的书写,我们分为几个步骤:

    1.添加悬浮窗权限

    2.书写悬浮窗代码,搭建悬浮窗布局

    3.判断悬浮窗权限是否开启,调用悬浮窗显示

    4.移除悬浮窗

    5.去权限管理页,开启悬浮窗权限

    第一步:AndroidManifest.xml中添加悬浮窗权限,如下:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
    第二步:搭建悬浮窗的xml布局

    布局的搭建我这里只是放了一个简单的按钮,布局名称为float_button,你可以自己取,如下代码:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
    <ImageView
        android:id="@+id/iv_float"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/zhibo" />
    </LinearLayout>
    

    接下来是书写显示悬浮窗代码,先看代码如下:

      WindowManager mWindowManager;
    WindowManager.LayoutParams wmParams;
    LinearLayout mFloatLayout;
    /**
     * 悬浮窗
     */
    private void showFloatView() {
        //获取LayoutParams对象
        wmParams = new WindowManager.LayoutParams();
        //获取的是LocalWindowManager对象
        mWindowManager = getWindow().getWindowManager();
        wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        wmParams.format = PixelFormat.RGBA_8888;
        wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        //悬浮窗在屏幕右下角
        wmParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;
        //距离右边50
        wmParams.x = 50;
        //距离底部170
        wmParams.y = 170;
        wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        LayoutInflater inflater = this.getLayoutInflater();
        mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_button, null);
        mWindowManager.addView(mFloatLayout, wmParams);
        ImageView iv_float = (ImageView) mFloatLayout.findViewById(R.id.iv_float);
        //触摸移动监听,可以移动悬浮窗的位置
        iv_float.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                //计算当前移动的位置,需要根据你悬浮窗的初始位置来进行不同的计算方法,我的是放在右下角,需要用到屏    幕的宽高
                wmParams.x = width - ((int) event.getRawX() - mFloatLayout.getWidth() / 2) - 100;
                wmParams.y = height - ((int) event.getRawY() - mFloatLayout.getHeight() / 2 - 40) - 170;
                mWindowManager.updateViewLayout(mFloatLayout, wmParams);
                return false;
            }
        });
        //点击事件监听
        iv_float.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.e("touch", "touching");
            }
        });
    }
    

    代码里面的height和width分别是屏幕的宽高,因为我设置的是在右下角显示,所以当监听悬浮窗移动时候要去计算当前的位置。

    获取屏幕宽高如下:

       /**
     * 获取屏幕的宽高
     */
     private int width;
     private int height;
     private void getWidthHeight() {
        WindowManager wm = (WindowManager) this
                .getSystemService(Context.WINDOW_SERVICE);
        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();
    }
    
    第三步:判断悬浮窗权限是否开启

    需要注意的是在android6.0版本以后,悬浮窗选取是默认关闭的,并且无法通过RxPermission进行判断权限,所以我们先进行版本号的判断,再进行悬浮窗是否开启的判断,代码如下:

     @RequiresApi(api = Build.VERSION_CODES.M)
     private void checkFloatPermission() {
        Log.e("SDK_INT", Build.VERSION.SDK_INT + "");
        //如果当期SDK版本大于21,也就是6.0及以上的话,进行权限判断,如果是6.0以下版本直接添加悬浮窗
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            //判断是否可以进行全局绘制,及悬浮窗是否有开启
            if (Settings.canDrawOverlays(this)) {
                createFloatView();
            } else {
                //没有开启则进行提示弹窗提示操作
                Toast.makeText(this, "请开启悬浮窗", Toast.LENGTH_SHORT).show();
                //showTipsDialog(MainActivity.this, "没有悬浮窗权限,直播按钮无法正常显示!", "知道了", "添加权限");
            }
        } else {
            createFloatView();
        }
    
    第四步:移除悬浮窗

    这个很简单,直接调用removeView方法就行了,看代码:

    mWindowManager.removeView(mFloatLayout);  
    
    第五步:开启权限管理页,添加悬浮窗权限

    android6.0以上系统默认是关闭的,我们要进行提示让用户去开启悬浮窗权限,就是跳转到权限管理页面,让用户手动开启悬浮窗权限,代码如下:

    /**
     * 打开系统app信息界面--修改权限
     */
    public static void openMyAppInfo(Context mContext) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts(SCHEME, mContext.getPackageName(), null);
        intent.setData(uri);
        mContext.startActivity(intent);
    }
    

    最后,如果觉得对你有帮助的话,点个喜欢,如果有疑问的话,请留言。

    相关文章

      网友评论

          本文标题:android 悬浮窗

          本文链接:https://www.haomeiwen.com/subject/xrucsxtx.html