通过WindowManager可以在当前窗体中添加和删除View,本示例是在窗体中添加一个Button,并且手指移动Button可以控制其在窗体中任意移动.
代码很简单,直接上代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button view = new Button(this);
view.setText("Hello World");
view.setTextColor(Color.WHITE);
view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
view.setBackgroundColor(Color.parseColor("#0000ff"));
addViewToWindow(view);
}
//窗体的布局参数
private WindowManager.LayoutParams params;
/**
* 添加View显示在当前窗体中
*/
private void addViewToWindow(View view) {
final WindowManager wm = (WindowManager) this.getSystemService(WINDOW_SERVICE);
params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
// 与窗体左上角对其
params.gravity = Gravity.TOP + Gravity.LEFT;//默认为Gravity.CENTER
params.x = 0;//距离Gravity.LEFT或者Gravity.RIGHT的偏移量,否则距离Gravity.CENTER的偏移量
params.y = 55;//距离Gravity.TOP或者Gravity.BOTTOM的偏移量,否则距离Gravity.CENTER的偏移量
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;//窗体透明
// android系统里面具有电话优先级的一种窗体类型,记得添加权限。android.permission.SYSTEM_ALERT_WINDOW
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
wm.addView(view, params);
//允许View在窗体中随手指的拖动和滚动
view.setOnTouchListener(new View.OnTouchListener() {
// 定义手指的初始化位置
int startX;
int startY;
@Override
public boolean onTouch(View view, MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:// 手指按下屏幕
startX = (int) e.getRawX();
startY = (int) e.getRawY();
break;
case MotionEvent.ACTION_MOVE:// 手指在屏幕上移动
int newX = (int) e.getRawX();
int newY = (int) e.getRawY();
//计算偏移量
int dx = newX - startX;
int dy = newY - startY;
//更新View在窗体的位置坐标:当前坐标+偏移量
params.x += dx;
params.y += dy;
// 考虑边界问题
if (params.x < 0) {
params.x = 0;
}
if (params.y < 0) {
params.y = 0;
}
if (params.x > wm.getDefaultDisplay().getWidth() - view.getWidth()) {
params.x = wm.getDefaultDisplay().getWidth() - view.getWidth();
}
if (params.y > wm.getDefaultDisplay().getHeight() - view.getHeight()) {
params.y = wm.getDefaultDisplay().getHeight() - view.getHeight();
}
//刷新位置
wm.updateViewLayout(view, params);
//更新初始位置
startX = (int) e.getRawX();
startY = (int) e.getRawY();
break;
}
return true;//消费触摸事件,不要让父控件 父布局响应触摸事件
}
});
}
}