需求:
实现一个悬浮于所有应用之上的小控件,并可随意拖动,可点击展开,不能影响下方应用正常使用。
实现:
public void switch2small() {
LayoutParams mTouchDotParams = new LayoutParams();
// 设置window type,位于顶层
mTouchDotParams.type = LayoutParams.TYPE_PRIORITY_PHONE;
//mTouchDotParams.type = LayoutParams.TYPE_BASE_APPLICATION;
//mTouchDotParams.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_PAN;;
// 设置图片格式,效果为背景透明
mTouchDotParams.format = PixelFormat.RGBA_8888;
//View以外的区域可以响应点击和触摸事件
mTouchDotParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
// 调整悬浮窗口至左上角,便于调整坐标
mTouchDotParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以屏幕左上角为原点,设置x、y初始位置
mTouchDotParams.x = 1050;
mTouchDotParams.y = 100;
// 设置悬浮窗口长宽数据
mTouchDotParams.width = LayoutParams.WRAP_CONTENT;
mTouchDotParams.height = LayoutParams.WRAP_CONTENT;
final ImageView view = new ImageView(this);
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(50, 50);
view.setLayoutParams(fl);
view.setImageResource(R.drawable.main_icon);
view.setClickable(true);
//点击
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.i("vga", "==small onclick======");
//view.setVisibility(View.GONE);
if(onScrolling)
return;
mWindowManager.removeViewImmediate(view);
setupLayoutParams();
}
});
//拖动
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();//获取事件发生时的坐标
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(lastX-mTouchDotParams.x)>50 || Math.abs(lastY-mTouchDotParams.y)>50){
return false;
}
if((int) event.getRawX() - lastX>10 || (int) event.getRawY() - lastY>10){
mTouchDotParams.x = (int) event.getRawX();
mTouchDotParams.y = (int) event.getRawY();
banClickToKTV(mTouchDotParams.x,mTouchDotParams.y,50,50);
mWindowManager.updateViewLayout(view, mTouchDotParams);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
return true;
}
onScrolling = true;
break;
case MotionEvent.ACTION_UP:
if(onScrolling){
onScrolling = false;
return true;
}
break;
}
return false;
}
});
mWindowManager.addView(view, mTouchDotParams);
}