Android 窗体控件

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

}

  

原文地址:https://www.cnblogs.com/qcgAd/p/5210221.html