效果图:
所需权限:
<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
为什么小窗体能显示在窗体呢?
new TableShowView(this).fun();
因为我们开了一个服务,服务会在后台运行如果只是在activity中启动
当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌
面的view也会消失所以这里采用的是启动一个服务,服务中创建我们需要
显示到table上的view,并将其注册到windowManager上
Activity
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
funClick(null);
}
});
}
public void funClick(View v){
//按钮被点击
this.startService(new Intent(this,Mser.class));
this.finish();
}
}
Service
public class Mser extends Service {
//服务
//这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service
@Override
public IBinder onBind(Intentintent) {
// TODO Auto-generated method stub
return null;
}
public void onCreate() {
//创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上
super.onCreate();
new TableShowView(this).fun();
}
}
View:
public class TableShowView extends View {
Context c;
WindowManager mWM;
WindowManager.LayoutParams mWMParams;
View win;
int tag = 0;
int oldOffsetX;
int oldOffsetY;
private WindowManager wm;
public TableShowView(Contextcontext) {
// TODO Auto-generated constructor stub
super(context);
c = context;
}
public void fun() {
// 拿到窗体管理器
mWM=(WindowManager)c.getSystemService(Context.WINDOW_SERVICE);
// 加载自己写的布局文件
win = LayoutInflater.from(c).inflate(R.layout.ctrl_window,null);
// 设置背景透明的
win.setBackgroundColor(Color.TRANSPARENT);
// 设置触摸事件
win.setOnTouchListener(new OnTouchListener()
// 记录移动前的坐标
float lastX, lastY;
public boolean onTouch(View v, MotionEvent event) {
final int action =event.getAction();
float x = event.getX();
float y = event.getY();
if(tag == 0){// 记录触摸的位置
oldOffsetX= mWMParams.x;
oldOffsetY = mWMParams.y;
}
if (action == MotionEvent.ACTION_DOWN) {
Log.i("i", "ACTION_DOWN");
// 按下的时候记录x,y
lastX = x;
lastY = y;
}
else if (action == MotionEvent.ACTION_MOVE) {
Log.i("i", "ACTION_MOVE");
// 当移动的时候 我们就改变图片的位置、
// 用当前的位置减去原始的位置
mWMParams.x += (int) (x -lastX);
mWMParams.y += (int) (y -lastY);
// 改变tag代表图片已经移动过
tag = 1;
// 修改图片在窗体内的的位置
mWM.updateViewLayout(win,mWMParams);
}
else if (action == MotionEvent.ACTION_UP){
// 如果当触摸离开屏幕的时候
Log.i("i", "ACTION_UP");
int newOffsetX =mWMParams.x;
int newOffsetY =mWMParams.y;
// 如果触摸的位置的抬起和放下中间没有移动过就属于点击
if(oldOffsetX == newOffsetX &&oldOffsetY == newOffsetY){
Toast.makeText(c,"点到我了", 1).show();
//wm.removeView(win);
}else {
// 否则记录现在位置
tag = 0;
}
}
return true;
}
});
wm = mWM;
// 布局参数
WindowManager.LayoutParams wmParams = newWindowManager.LayoutParams();
mWMParams = wmParams;
// 类型
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT =2003
wmParams.type = 2003;
// 标识
wmParams.flags = 40;
// 宽
wmParams.width = 50;
// 高
wmParams.height = 50;
// 格式
// PixelFormat.TRANSLUCENT= -3
wmParams.format = -3;
// 添加到窗体
wm.addView(win, wmParams);
}
}