Android悬浮框

package com.apkstory.service;

import com.apkstory.R;
import com.apkstory.util.MyApplication;

import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;

/**
 * 悬浮窗的制作
 * @author 锋翼
 * @link www.apkstory.com
 */
public class TopFloatService extends Service {

        WindowManager wm = null;
        WindowManager.LayoutParams wmParams = null;
        View view;
        private float mTouchStartX;
        private float mTouchStartY;
        private float x;
        private float y;
        
        @Override
        public void onCreate() {
                super.onCreate();
                view = LayoutInflater.from(this).inflate(R.layout.floating, null);
                createView();
        }

        private void createView() {
                // 获取WindowManager
                wm = (WindowManager) getApplicationContext().getSystemService("window");
                // 设置LayoutParams(全局变量)相关参数
                wmParams =  ((MyApplication) getApplication()).getMywmParams();
                wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面
                wmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受任何按键事件
                wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
                // 以屏幕左上角为原点,设置x、y初始值
                wmParams.x = 0;
                wmParams.y = 0;
                // 设置悬浮窗口长宽数据
                wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
                wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
                wmParams.format = PixelFormat.RGBA_8888;

                wm.addView(view, wmParams);

                view.setOnTouchListener(new OnTouchListener() {
                        public boolean onTouch(View v, MotionEvent event) {
                                // 获取相对屏幕的坐标,即以屏幕左上角为原点
                                x = event.getRawX();
                                // 25是系统状态栏的高度,也可以通过方法得到准确的值,自己微调就是了
                                y = event.getRawY()-25 ; 
                                switch (event.getAction()) {
                                case MotionEvent.ACTION_DOWN:
                                        // 获取相对View的坐标,即以此View左上角为原点
                                        mTouchStartX = event.getX();
                                        mTouchStartY = event.getY()+view.getHeight()/2;
                                        break;
                                case MotionEvent.ACTION_MOVE:
                                        updateViewPosition();
                                        break;
                                case MotionEvent.ACTION_UP:
                                        updateViewPosition();
                                        mTouchStartX = mTouchStartY = 0;
                                        break;
                                }
                                return true;
                        }

                });
        }
        
        private void updateViewPosition() {
                // 更新浮动窗口位置参数
                wmParams.x = (int) (x - mTouchStartX);
                wmParams.y = (int) (y - mTouchStartY);
                wm.updateViewLayout(view, wmParams);
        }

        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值