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;        }}

更多相关文章

  1. Android获取手屏幕尺寸
  2. android获取屏幕的宽高
  3. android > 获取屏幕分辨率
  4. Android保持屏幕常亮,PowerManager.WakeLock的使用
  5. android中屏幕亮度相关设置
  6. android判断屏幕为横屏还是竖屏
  7. android 获得屏幕宽和高
  8. Android在屏幕任意位置显示对话框
  9. 设置屏幕显示模式ScreenOrientation.

随机推荐

  1. 【ArcGIS for Android】经纬度坐标、地图
  2. android Camera拍照 及 MediaRecorder录
  3. Android完美处理RecyclerView实现item条
  4. Android基础之intent传值的三种方法
  5. Android(安卓)通知栏
  6. android 之 Broadcast(广播) BroadcastRe
  7. 在一个app中唤醒拉起另一个app应用(DeepLi
  8. Android(安卓)补间动画使用记录
  9. Android(安卓)logcat命令使用
  10. Android(安卓)花里胡哨的加载Loading动画