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