Android之获取view 、window之间的间距区域

1.获取相对于父ViewGroup的坐标:
getLeft , getTop, getBottom, getRight
2.获取相对于窗口的坐标:
getLocationInWindow

[java]  view plain copy
  1. int[] position = new int[2];  
  2. textview.getLocationInWindow(position);   
  3. System.out.println("getLocationInWindow:" + position[0] + "," + position[1]);   
3.获取相对于屏幕的坐标:

getLocationOnScreen

[java]  view plain copy
  1. int[] position = new int[2];   
  2. textview.getLocationOnScreen(position);   
  3. System.out.println("getLocationOnScreen:" + position[0] + "," + position[1]);   


理解图:


4.获取:屏幕高度、状态栏高度、标题栏高度




屏幕区域的获取:

[java]  view plain copy
  1. activity.getWindowManager().getDefaultDisplay();    
         应用区域的获取:

[java]  view plain copy
  1. Rect outRect = new Rect();    
  2. activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);    
        view绘制区域获取:

[java]  view plain copy
  1. Rect outRect = new Rect();    
  2. activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);    

用绘制区域的outRect.top - 应用区域的outRect.top 即是标题栏的高度。

注意: 如果刚启动Activity时就要计算这些数据,最好在 onWindowFocusChanged  函数中进行, 否则得到的某些数据可能是错误的,比如,应用区域高宽的获取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过以下代码获取当前最顶层的Window对象: ```java WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); Window topWindow = null; if (wm != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { topWindow = wm.getCurrentWindowMetrics().getWindow(); } else { List<WindowManager.LayoutParams> paramsList = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); // 重复获取多次,确保获取到最顶层的Window wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); wm.getDefaultDisplay().getRealMetrics(new DisplayMetrics()); for (WindowManager.LayoutParams params : wm.getDefaultDisplay().getRealSize().getWindowLayoutInDisplayCutout().getMaxSizeParams()) { paramsList.add(params); } } else { for (int i = 0; i < wm.getDefaultDisplay().getWidth(); i += 10) { for (int j = 0; j < wm.getDefaultDisplay().getHeight(); j += 10) { View view = new View(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.width = 10; params.height = 10; params.x = i; params.y = j; params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; params.format = PixelFormat.TRANSLUCENT; wm.addView(view, params); paramsList.add(params); } } } if (!paramsList.isEmpty()) { Collections.sort(paramsList, new Comparator<WindowManager.LayoutParams>() { @Override public int compare(WindowManager.LayoutParams o1, WindowManager.LayoutParams o2) { return o1.token == null ? -1 : (o2.token == null ? 1 : Integer.compare(o1.token.hashCode(), o2.token.hashCode())); } }); WindowManager.LayoutParams topParams = paramsList.get(paramsList.size() - 1); topWindow = new PhoneWindow(this); topWindow.setAttributes(topParams); } } } ``` 需要注意的是,该方法在 Android 11 及以上版本中使用 `WindowManager#getCurrentWindowMetrics()` 获取最顶层的Window对象,而在 Android 10 及以下版本中则使用遍历所有Window的方式获取最顶层的Window对象,这种方式可能会导致性能问题。因此,建议在 Android 11 及以上版本中使用 `WindowManager#getCurrentWindowMetrics()` 获取最顶层的Window对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值