Service创建悬浮框

首先,介绍下作用,及功能,

利用service创建悬浮框,然后这个悬浮框不能影响界面其他的按键,所以需要拖动,然后并且放大状态是放在中间,缩小放在左;

注意:自己的布局宽高不能使用FILL_PARENT,以及
wmParams.gravity不一样,然后默认的x,y不一样,所以需要是情况而定,并且拖动更新wmParams的x,y也一样,要视情况而定取值;
例如:
1.wmParams.gravity = Gravity.BOTTOM;
wmParams.x = 0;
wmParams.y =0;
整个布局显示在底部中间位置;
2.wmParams.gravity 为默认值;
wmParams.x = 0;
wmParams.y =0;
整个布局显示在中间位置;

1.创建管理器:
WindowManager mWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
2.设置布局:
LayoutParams wmParams = new LayoutParams();
        wmParams.type = LayoutParams.TYPE_PHONE;//设置类型
        //wmParams.type = LayoutParams.LAST_APPLICATION_WINDOW
        wmParams.format = PixelFormat.TRANSLUCENT; //设置形式
        wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
        //          wmParams.gravity = Gravity.BOTTOM;
        //          wmParams.x = 0; //坐标
        //          wmParams.y = 0;//坐标
        //获取屏的高和宽
    DisplayMetrics dm = new DisplayMetrics();
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        display.getMetrics(dm);
        int widthPixels = dm.widthPixels;
        int heightPixels = dm.heightPixels;
        float density = dm.density;
        screenWidth = (int) (widthPixels * density);
        screenHeight = (int) (heightPixels * density);
                /*设置布局的位置距离底部40dp,水平居中*/
        wmParams.x = 0;
        wmParams.y = screenHeight /2 - 40;
        wmParams.width = LayoutParams.WRAP_CONTENT;
//      wmParams.height = LayoutParams.WRAP_CONTENT;
        // if( heightPixels<500 )
        // if( dm.densityDpi>200 )
        wmParams.height = 70;

3.添加布局:
    LayoutInflater inflater = LayoutInflater.from(getApplication());

        mFloatTopLayout = (RelativeLayout) inflater.inflate(
                R.layout.menu_float_top, null);
floatBig = (ImageView) mFloatTopLayout.findViewById(R.id.iv_float_big);
    floatSmall = (ImageView) mFloatTopLayout.findViewById(R.id.iv_float_small);

    mWindowManager.addView(mFloatTopLayout, wmParams);
4.触摸拖动效果
    floatSmall.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                llFloatBottom.setVisibility(View.GONE);
                floatBig.setVisibility(View.VISIBLE);
//              wmParams.gravity = Gravity.LEFT;
                wmParams.x = (int) (-screenWidth);
                mWindowManager.updateViewLayout(mFloatTopLayout, wmParams);
            /*  if (top.contains("SystemWifiActivity")) {
                    showFloatLeftLayout();
                } else {
                    llFloatBottom.setVisibility(View.GONE);
                    floatBig.setVisibility(View.VISIBLE);
                }*/
            }
        });
    floatBig.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                           llFloatBottom.setVisibility(View.VISIBLE);
                floatBig.setVisibility(View.GONE);
                updateMiddleView();
            }
        });
    floatBig.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return iTouch(v,event);
            }
        });

    private void updateMiddleView() {
        wmParams.x = 0;
        wmParams.y = screenHeight / 2 - MARGIN_BOTTOM;
//      wmParams.gravity = Gravity.CENTER_HORIZONTAL;
        mWindowManager.updateViewLayout(mFloatTopLayout, wmParams);
    }

    private boolean iTouch(View v, MotionEvent event) {
        boolean bret = false;
        Rect frame = new Rect();
        mFloatTopLayout.getWindowVisibleDisplayFrame(frame);
        //int statusBarHeight = frame.top;
        x = event.getRawX();
        y = event.getRawY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mTouchX = (event.getX()+v.getLeft());
                mTouchY = (event.getY()+v.getTop());
                //mTouchX = event.getX();
                //mTouchY = event.getY();
                bMoved = false;

                x1 = event.getX();
                y1 = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                updateViewPosition();
                bMoved = true;
                break;
            case MotionEvent.ACTION_UP:
                //updateViewPosition();
                mTouchX = mTouchY = 0;
                if( bMoved )
                    bret = true;
                bMoved = false;
                x2 = event.getX();
                y2 = event.getY();

                break;
        }
        return bret;
    }

    private void updateViewPosition() {
        try {
            mLastX = wmParams.x = (int) (x - mTouchX - screenWidth / 2);
            mLastY = wmParams.y = (int) (y - mTouchY - screenHeight / 2);
            Log.e("www", "mTouchX = " + mTouchX + ",mTouchY = " + mTouchY);
            Log.e("www", "x = " + x + ",y = " + y);
            //wmParams.width = LayoutParams.WRAP_CONTENT;
            //wmParams.height = LayoutParams.WRAP_CONTENT;
            mWindowManager.updateViewLayout(mFloatTopLayout, wmParams);
        } catch (Exception e) {

        }
    }


5.补充下这个代码的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/iv_float_big"
        android:visibility="gone"
        android:background="@drawable/selector_video_big"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <LinearLayout
        android:id="@+id/ll_float_bottom"
        android:background="@drawable/float_bottom_bg"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/iv_float_home"
           android:background="@drawable/selector_float_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <ImageView
            android:id="@+id/iv_float_back"
            android:background="@drawable/selector_float_back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <ImageView
            android:id="@+id/iv_float_voice"
            android:background="@drawable/selector_float_volum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <ImageView
            android:id="@+id/iv_float_clear"
            android:background="@drawable/selector_float_clear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <ImageView
            android:id="@+id/iv_float_small"
            android:background="@drawable/selector_float_small"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</RelativeLayout>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容