安卓中Activity,Dialog,Toast等视图都是附在Window上的,Window是View的直接管理者
final WindowManager windowManager = (WindowManager)
getSystemService(Context.WINDOW_SERVICE);// "window"
final WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();
//若不设置gravity ,并且不设置windowParams.x和windowParams.y,则默认位于屏幕中除去通知栏以外部分的中间位置
//若设置为windowParams.gravity = Gravity.RIGHT|Gravity.TOP;并且不设置windowParams.x和windowParams.y
//则位于屏幕除通知栏以外的左上角
//windowParams.x和windowParams.y的是偏移量
//由于没有设置windowParams.gravity,所以下面的设置会看到新窗口位于中央(屏幕中除去通知栏以外部分的中央)偏右100像
//素,偏上200像素处,若x或y超出了屏幕中除去通知栏以外部分,则新窗口也会位于边沿而不会一块在里面一块在外面
windowParams.x=100;
windowParams.y=-200;
// 设置宽和高
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
//当前Window区域以外的事件会交给下层Window,当前Window区域以内的事件自己处理,通常会设置这个属性,否则其他Window无法收到单击事件
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
//透明度
windowParams.alpha=0.3f;
final ImageView iv=new ImageView(getApplicationContext()){
float startLayoutX,startLayoutY,startTouchX,startTouchY;
@Override
public boolean onTouchEvent(MotionEvent event) {
/*windowParams.x和windowParams.y是偏移量,所以要记录一开始的触摸位置和窗口位置,
*
*/
if (event.getAction()==MotionEvent.ACTION_DOWN) {
startLayoutX=windowParams.x;
startLayoutY=windowParams.y;
startTouchX=event.getRawX();
startTouchY=event.getRawY();
}
float x=event.getRawX();
float y=event.getRawY();
//当前位置和按下的位置的差值为偏移量,把该偏移量加到按下时的偏移量上作为窗口新的位置
windowParams.x= (int) (startLayoutX+(x-startTouchX)) ;
windowParams.y=(int) (startLayoutY+(y-startTouchY));
//更新位置
windowManager.updateViewLayout(this, windowParams);
return true;
}
};
iv.setImageResource(R.drawable.ic_launcher);
iv.setBackgroundColor(Color.BLUE);
windowManager.addView(iv, windowParams);
不管怎么拖动都不会超出屏幕边界