Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android popupwindow以及windowManager總結——實現懸浮效果

Android popupwindow以及windowManager總結——實現懸浮效果

編輯:關於Android編程

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
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());

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved