Android中PopupWindow位置的确定一般通过showAsDropDown函数来实现,该函数有两个重载函数,分别定义如下:

[java] view plain copy print ?
  1. publicvoidshowAsDropDown(Viewanchor){
  2. showAsDropDown(anchor,0,0);
  3. }
  4. publicvoidshowAsDropDown(Viewanchor,intxoff,intyoff){
  5. if(isShowing()||mContentView==null){
  6. return;
  7. }
  8. registerForScrollChanged(anchor,xoff,yoff);
  9. mIsShowing=true;
  10. mIsDropdown=true;
  11. WindowManager.LayoutParamsp=createPopupLayout(anchor.getWindowToken());
  12. preparePopup(p);
  13. updateAboveAnchor(findDropDownPosition(anchor,p,xoff,yoff));
  14. if(mHeightMode<0)p.height=mLastHeight=mHeightMode;
  15. if(mWidthMode<0)p.width=mLastWidth=mWidthMode;
  16. p.windowAnimations=computeAnimationResource();
  17. invokePopup(p);
  18. }

也就是说,调用第一个函数时,x和y坐标偏移量默认是0,此时PopupWindow显示的结果如下中图所示。而要实现PopupWindow显示在wenwen的正下方时,就需要程序员自己进行坐标偏移量的计算,下右图所示,当点击wenwen时,PopupWindow显示在正下方,这正是我们所需要的,对称是一种美啊。




代码实现的关键是点击wenwen后的响应函数,此处直接上代码,不废话了:

[java] view plain copy print ?
  1. publicvoidonClick(Viewv){
  2. LayoutInflatermLayoutInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
  3. ViewGroupmenuView=(ViewGroup)mLayoutInflater.inflate(
  4. R.layout.tips,null,true);
  5. pw=newPopupWindow(menuView,LayoutParams.WRAP_CONTENT,
  6. LayoutParams.WRAP_CONTENT,true);
  7. //设置点击返回键使其消失,且不影响背景,此时setOutsideTouchable函数即使设置为false
  8. //点击PopupWindow外的屏幕,PopupWindow依然会消失;相反,如果不设置BackgroundDrawable
  9. //则点击返回键PopupWindow不会消失,同时,即时setOutsideTouchable设置为true
  10. //点击PopupWindow外的屏幕,PopupWindow依然不会消失
  11. pw.setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));
  12. pw.setOutsideTouchable(false);//设置是否允许在外点击使其消失,到底有用没?
  13. pw.setAnimationStyle(R.style.PopupAnimation);//设置动画
  14. //计算x轴方向的偏移量,使得PopupWindow在Title的正下方显示,此处的单位是pixels
  15. intxoffInPixels=ScreenTools.getInstance(PopDemoActivity.this).getWidth()/2-titleName.getWidth()/2;
  16. //将pixels转为dip
  17. intxoffInDip=ScreenTools.getInstance(PopDemoActivity.this).px2dip(xoffInPixels);
  18. pw.showAsDropDown(titleName,-xoffInDip,0);
  19. //pw.showAsDropDown(titleName);
  20. pw.update();
  21. TextViewtv=(TextView)menuView.findViewById(R.id.tips_ok);
  22. tv.setOnClickListener(newView.OnClickListener(){
  23. publicvoidonClick(Viewv){
  24. pw.dismiss();
  25. }
  26. });
  27. }


更多相关文章

  1. android报错——The import android.util cannot be resolved
  2. Android点击图标重新启动问题
  3. 分析android的usb-gadget
  4. android工具之TraceView学习笔记
  5. 转Android(安卓)安全攻防(一):SEAndroid的编译
  6. Android自带Music播放器更新播放时间和进度条的方法
  7. Android架构分析之使用自定义硬件抽象层(HAL)模块
  8. Android实现点击两次返回键退出
  9. 箭头函数的基础使用

随机推荐

  1. android PopupWindow
  2. android之相对布局示例
  3. android progressBar 背景改变
  4. 编译android 源码
  5. Android(Java):边框
  6. android ui LinearLayout中按扭平行显示
  7. Android(安卓)内存笔记
  8. android firstslide
  9. android 官方SDK文档
  10. Android(安卓)常见广告库包名合集