跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

android popupwindow用法详解

本文实例为大家分享了android popupwindow的用法,供大家参考,具体内容如下

一、基本用法

一般做法,新建类继承popupwindow。例/*** popupwindow基本用法* Created by Administrator on 2015/11/25.

*/ public class DemoBasePop extends PopupWindow {private LinearLayout linear_layout;private TextView dbp_text;private Context context;public DemoBasePop(final Activity context) {super(context);this.context = context;View view = LayoutInflater.from(context).inflate(R.layout.demo_base_pop,null);

setContentView(view);setWidth(ViewGroup.LayoutParams.MATCH_PARENT);setHeight(200);// setHeight(ViewGroup.LayoutParams.MATCH_PARENT);

setFocusable(true);setBackgroundDrawable(new BitmapDrawable());setTouchable(true);setOutsideTouchable(true);setAnimationStyle(R.style.popwin_anim_style);// setAnimationStyle(0); 0是没有animation

initView(view);

}

private void initView(View view) {dbp_text = (TextView) view.findViewById(R.id.dbp_text);}

}研究下popupwindow源码,以showAsDropDown来讲public void showAsDropDown(View anchor, int xoff, int yoff) {if (isShowing() || mContentView == null) {return;}

registerForScrollChanged(anchor, xoff, yoff);

mIsShowing = true;mIsDropdown = true;

WindowManager.LayoutParams p = createPopupLayout(anchor.getWindowToken());preparePopup(p);

updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff));

if (mHeightMode < 0) p.height = mLastHeight = mHeightMode;if (mWidthMode < 0) p.width = mLastWidth = mWidthMode;

p.windowAnimations = computeAnimationResource();

invokePopup(p);}第11行创建WindowManager.LayoutParams。第12行preparePopup()中:if (mBackground != null) {final ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams();int height = ViewGroup.LayoutParams.MATCH_PARENT;if (layoutParams != null &&layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) {height = ViewGroup.LayoutParams.WRAP_CONTENT;}

// when a background is available, we embed the content view// within another view that owns the background drawable PopupViewContainer popupViewContainer = new PopupViewContainer(mContext);PopupViewContainer.LayoutParams listParams = new PopupViewContainer.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);popupViewContainer.setBackgroundDrawable(mBackground);popupViewContainer.addView(mContentView, listParams);

mPopupView = popupViewContainer;} else {mPopupView = mContentView;}如果做了setBackgroundDrawable(new BitmapDrawable());那么mBackground则不为空,则会用PopupViewContainer作为mPopupView(即内容view)。而PopupViewContainer的dispatchKeyEvent对返回键做了处理,按返回键后其中调用dismiss()方法。其onTouchEvent对触摸事件做了处理,其源码:public boolean onTouchEvent(MotionEvent event) {final int x = (int) event.getX();final int y = (int) event.getY();//点击外部隐藏if ((event.getAction() == MotionEvent.ACTION_DOWN)&& ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {dismiss();return true;} else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {dismiss();return true;} else {return super.onTouchEvent(event);}}系统做了这些处理,随之而来一个问题,如果我们要监听物理返回键该怎么办。看了上面的过程,我们可以想到将setBackgroundDrawable(null);然后通过设置view的key监听,监听到后做相应的处理。

view.setOnKeyListener(new View.OnKeyListener() {@Override public boolean onKey(View v, int keyCode, KeyEvent event) {if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {if (event.getAction() == KeyEvent.ACTION_DOWN&& event.getRepeatCount() == 0) {outAnimator.start();return true;}}return false;}});

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:Android简单使用PopupWindow的方法Android使用 PopupWindow 实现底部弹窗功能解决Android popupWindow设置背景透明度无效的问题Android 开发使用PopupWindow实现弹出警告框的复用类示例Android PopUpWindow使用详解

相关文章