正文  UI设计 > Dialog/PopupWindow >

Android popupwindow以及windowManager总结——实现悬浮效果

Android有三类窗口应用程序窗口 (Application Window): 包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口。子窗口(Sub Window):比如...

Android有三类窗口

应用程序窗口 (Application Window): 包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口。

子窗口(Sub Window):比如应用自定义的对话框,或者输入法窗口,子窗口必须依附于某个应用窗口(设置相同的token)。

系 统窗口(System Window): 系统设计的,不依附于任何应用的窗口,比如说,状态栏(Status Bar), 导航栏(Navigation Bar), 壁纸(Wallpaper), 来电显示窗口(Phone),锁屏窗口(KeyGuard), 信息提示窗口(Toast), 音量调整窗口,鼠标光标等等。

popupwindow是属于 sub window的,所以一定要有一个view去依附

主要有两个方法

showAtLocation(View parent, int gravity, int x, int y)

显示popupwindow在特殊的位置

showAsDropDown(View anchor, int xoff, int yoff)

显示在view anchor左下x偏移以及y偏移的位置

public void on_effect(final View v){
/*	data.src_bmp=myview.bmp;
	Intent intent=new Intent(drowview.this,bmpeffect.class);
	startActivity(intent);
	*/
	//前面那个线性布局消失
	Log.e("on_effect", "ing");
	pop_num=0;
	//relayout2.setVisibility(View.GONE);
	//relayout.setVisibility(View.VISIBLE);
	
  show=true;
	 int[] location = new int[2];  
     v.getLocationOnScreen(location);  
     Log.e(""+location[0], ""+location[1]);
	mypopwindow.showAtLocation(v, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,0);
	
}

Android系统窗口实现悬浮以及监听Ontouch事件

public void on_show(final View v){
		//showpop=(LinearLayout) findViewById(R.id.linearLayoutpop1);
		//Log.e("show", "ing");
		if(pop_show_flag==false){
	showpop.setVisibility(View.VISIBLE);
	leftpop.invalidate();
	windowManager.removeViewImmediate(leftpop);
	//leftpop.setOnTouchListener(l)
	leftpop=getLayoutInflater().inflate(R.layout.leftpopwindow2, null);
	
	leftpop.setOnTouchListener(mylistener);
	windowManager.addView(leftpop, windowManagerParams);
	windowManager.updateViewLayout(leftpop,windowManagerParams);
	pop_show_flag=true;
	Log.e("show", "flase");
		}
		else{
			windowManager.removeViewImmediate(leftpop);
			leftpop=getLayoutInflater().inflate(R.layout.leftpopwindow,null);
			leftpop.setOnTouchListener(mylistener);
			windowManager.addView(leftpop, windowManagerParams);
			windowManager.updateViewLayout(leftpop,windowManagerParams);
			pop_show_flag=false;
			Log.e("show", "true");
		}
		
	}

window的参数初始化

	windowManager=this.getWindowManager();
		windowManagerParams=new WindowManager.LayoutParams();
		windowManagerParams.format = PixelFormat.RGBA_8888;; 
		windowManagerParams.type =  android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
		windowManagerParams.flags=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
				|android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
				//|android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
			//	windowManagerParams.flags=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
		windowManagerParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;

format表示透明,下面可以看见

type可以试系统窗口中的TYPE_PHONE,或者其他的,窗口值越大,现在越在上面,

flag表示视图的参数,表示是否可以触摸,可以聚焦等。

grvavity表示view的位置等。

leftpop.setOnTouchListener(mylistener);在这个里面设置ontouch监听器,可以手动调用下面的onTouch

html">mylistener=new OnTouchListener(){
	         @Override
				public boolean onTouch(View v, MotionEvent event) {
					// TODO Auto-generated method stub
					Log.e("top", "ing");
				//	v.
					my_drow_view.onTouchEvent(event);//这里调用下面的onTouch
					return true;
				}
			
			};


popupwindow点击view以外的地方消失

popupWindow.setFocusable(true);

这样,显示的时候,popupWindow获取啦焦点,后面的内容为非活动。

但是这样不能实现点击屏幕其他部分使其消失,返回键也不行。

这时候要给popupWindow设置一个一个BackgroundDrawable,如果你已经定义好布局,怕破坏掉样式,只需要设置一个空的Drawable即可。


popupWindow.setBackgroundDrawable(new PaintDrawable());