public class MainActivity extends Activity { private static WindowManager windowManger = null; // 悬浮窗的属性都在这里设置 private static WindowManager.LayoutParams lp = null; // 定义一个悬浮的view private static TextView textView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 这是在获取windowmanager对象 // 1、获取windowmanager的时候用的上下文,也要是app的。不然就退出不显示 windowManger = (WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); lp = new WindowManager.LayoutParams(); // 警告框,覆盖物 lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; // 首先不获取焦点,为了让桌面上的图标正常使用,全屏可移动 lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_FULLSCREEN; lp.x = 10; lp.y = 50; lp.gravity = Gravity.LEFT | Gravity.TOP; // 整个悬浮窗有多大?包裹内容 lp.width = WindowManager.LayoutParams.WRAP_CONTENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; // 半透明效果 lp.format = PixelFormat.TRANSPARENT; if (textView == null) { // 实例它的时候别用activity,因为我们这个是悬浮窗,也就是activity不在的时候,也要显示 textView = new TextView(getApplicationContext()); // textView里面内容 textView.setText("123123"); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } }); textView.setOnTouchListener(new OnTouchListener() { private WindowManager.LayoutParams mLp = lp; private int lastX; private int lastY; private long lastDownTime = -1; // 触摸监听 @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub // 2、 // getX // 此方法坐标系相对于view // getRawX // 此方法是获取相对于手机屏幕的位置 // 这个值用于返回 boolean ret = false; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastDownTime = System.currentTimeMillis(); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); ret = true; break; case MotionEvent.ACTION_MOVE: float x = event.getRawX(); float y = event.getRawY(); int ix = (int) (x - lastX); int iy = (int) (y - lastY); mLp.x += ix; mLp.y += iy; lastX = (int) x; lastY = (int) y; // 把已经求解到的mlp作为参数,重新交给view windowManger.updateViewLayout(textView, mLp); break; case MotionEvent.ACTION_UP: long ct = System.currentTimeMillis(); if (ct - lastDownTime < 300) { // 触发源生的点击事件 textView.performClick(); } break; default: break; } return ret; } }); // 把这个textview显示出来 windowManger.addView(textView, lp); } else { windowManger.removeView(textView); textView = null; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }