Android PopupWindow實戰仿QQ底部彈出

Android提供兩種對話框形式,一種是popupwindow,一種是dialog,先爲大家說明一下兩者的區別。

位置:AlertDialog的位置固定,而PopupWindow的位置可以隨意。

showAsDropDown(View anchor):相對某個控件的位置(正左下方),無偏移

showAsDropDown(View anchor, int xoff, int yoff):相對某個控件的位置,有偏移

showAtLocation(View parent, int gravity, int x, int y):相對於父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設置偏移或無偏移

線程:AlertDialog是非阻塞線程的,而PopupWindow是阻塞線程的。

第一個案例


講解一下重要的代碼部分,稍後我會講源碼發出去供大家下載。

簡單的案例,大家先看一下代碼

public class MyPopupWindow extends PopupWindow {
	private Button btn_take_photo, btn_pick_photo, btn_cancel;
	private View mMenuView;
	public MyPopupWindow(Activity context, OnClickListener itemsOnClick) {
		super(context);
		LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		mMenuView = inflater.inflate(R.layout.alert_dialog, null);
		btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
		btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
		btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
		//取消按鈕
		btn_cancel.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				//銷燬彈出框
				dismiss();
			}
		});
		//設置按鈕監聽
		btn_pick_photo.setOnClickListener(itemsOnClick);
		btn_take_photo.setOnClickListener(itemsOnClick);
		this.setContentView(mMenuView);
		this.setWidth(LayoutParams.FILL_PARENT);
		this.setHeight(LayoutParams.WRAP_CONTENT);
		this.setFocusable(true);
		this.setTouchable(true);
		this.setAnimationStyle(R.style.PopupAnimation);
		ColorDrawable dw = new ColorDrawable(Color.TRANSPARENT);
		this.setBackgroundDrawable(dw);
		//mMenuView添加OnTouchListener監聽判斷獲取觸屏位置如果在選擇框外面則銷燬彈出框
		mMenuView.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				int height = mMenuView.findViewById(R.id.pop_layout).getTop();
				int y = (int) event.getY();
				if (event.getAction() == MotionEvent.ACTION_UP) {
					if (y < height) {
						dismiss();
					}
				}
				return true;
			}
		});
	}
}
看一下MainActivity的實現

public class MainActivity extends Activity {
	//自定義的彈出框類
	MyPopupWindow menuWindow;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final TextView tv = (TextView) this.findViewById(R.id.text);
		//把文字控件添加監聽,點擊彈出自定義窗口
		tv.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				menuWindow = new MyPopupWindow(MainActivity.this,itemsOnClick);
				//顯示窗口
				menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //設置layout在PopupWindow中顯示的位置
			}
		});
	}
	//爲彈出窗口實現監聽類
	private OnClickListener itemsOnClick = new OnClickListener() {

		public void onClick(View v) {
			menuWindow.dismiss();
			switch (v.getId()) {
			case R.id.btn_take_photo:
				break;
			case R.id.btn_pick_photo:
				break;
			default:
				break;
			}
		}
	};
}

下載Demo請猛戳

第二個案例

①.如上圖所示在構造PopupWindow的實例時,制定它的寬度是button的寬度,如下代碼

PopupWindow popu = new PopupWindow(mPopup, btn.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
②.點擊外部時,當前PopupWindow就消失,如下代碼

popu.setOutsideTouchable(true);
③.設置PopupWindow可以獲取焦點

popu.setFocusable(true);
④.調用顯示位置的showAtLocation方法

int[] location = new int[2];
btn.getLocationOnScreen(location);
popu.showAtLocation(btn, Gravity.NO_GRAVITY, location[0], location[1] + btn.getHeight());
下載Demo請猛戳

第三個案例


關鍵是在ListView的Adapter中對popupwindow的處理

在構建Adapter實例的時候,初始化popupwindow,並顯示

/** 
 * 初始化popWindow
 * */
private void initPopWindow() {
	View popView = inflater.inflate(R.layout.listview_pop, null);
	popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
	popupWindow.setBackgroundDrawable(new ColorDrawable(0));
	//設置popwindow出現和消失動畫
	popupWindow.setAnimationStyle(R.style.PopMenuAnimation);
	btn_pop_close = (ImageView) popView.findViewById(R.id.btn_pop_close);
}
/** 
 * 顯示popWindow
 * */
public void showPop(View parent, int x, int y, int postion) {
	//設置popwindow顯示位置
	popupWindow.showAtLocation(parent, Gravity.AXIS_X_SHIFT, x, y);
	//獲取popwindow焦點
	popupWindow.setFocusable(true);
	//設置popwindow如果點擊外面區域,便關閉。
	popupWindow.setOutsideTouchable(true);
	popupWindow.update();
	if (popupWindow.isShowing()) {
		popupWindow.dismiss();
	}
	btn_pop_close.setOnClickListener(new OnClickListener() {
		public void onClick(View paramView) {
			popupWindow.dismiss();
		}
	});
}
下載Demo請猛戳




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章