android popupwindow用法详解
人气:0一、基本用法
一般做法,新建类继承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(); <span style="font-family: 宋体; font-size: 9pt;">//点击外部隐藏</span> 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 和 Activity弹出窗口实现方式
- android popwindow实现左侧弹出菜单层及PopupWindow主要方法介绍
- Android Animation实战之屏幕底部弹出PopupWindow
- Android编程实现popupwindow弹出后屏幕背景变成半透明效果
- Android入门之PopupWindow用法实例解析
- Android实现底部弹出PopupWindow背景逐渐变暗效果
- Android之用PopupWindow实现弹出菜单的方法详解
- Android中PopupWindow响应返回键并关闭的2种方法
- android使用PopupWindow实现页面点击顶部弹出下拉菜单
- android自定义popupwindow仿微信右上角弹出菜单效果
加载全部内容