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

Java代码
  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代码
  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. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Android(安卓)Studio 设置内存大小及原理
  3. AlertDialog使用自定义的布局
  4. android javascript 调用activity
  5. java.io.IOException:Can't read [F:\..\android-support-v4.ja
  6. android之解析包时出现错误(二)
  7. android之点击回退键俩次退出程序
  8. Android之Handler的post注意事项
  9. 基于rk3288平台android5.1系统的wifi流程分析 ---- 打开wifi,扫描

随机推荐

  1. Android设置launchMode为singleTask的Act
  2. Android(安卓)使用obb扩展App
  3. AIR Native Extension on Android(安卓)-
  4. Android(安卓)集成TBS浏览文档,不调用手
  5. Android实现文件的复制
  6. Android处理器
  7. Android(安卓)之 Shader 用法详细介绍
  8. Android通过HttpURLConnection获取JSON并
  9. Android(安卓)读取手机通讯录内容
  10. Android强大的图片加载框架Fresco简单用