Android经典实战之如何获取View和ViewGroup的中心点

简介: 本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在 Android 中,要获取 ViewViewGroup 的中心点(即中心坐标),可以通过以下步骤完成。

获取 View 中心点

View 的中心点可以通过获取其左上角坐标和宽高计算得出。

val view = findViewById<View>(R.id.your_view_id)

// 获取 View 的左上角位置
val x = view.left
val y = view.top

// 获取 View 的宽度和高度
val width = view.width
val height = view.height

// 计算中心点
val centerX = x + width / 2
val centerY = y + height / 2

println("View Center: ($centerX, $centerY)")

获取 ViewGroup 中心点

ViewGroup 也是一种 View,所以获取中心点的方法与 View 类似。

val viewGroup = findViewById<ViewGroup>(R.id.your_viewgroup_id)

// 获取 ViewGroup 的左上角位置
val x = viewGroup.left
val y = viewGroup.top

// 获取 ViewGroup 的宽度和高度
val width = viewGroup.width
val height = viewGroup.height

// 计算中心点
val centerX = x + width / 2
val centerY = y + height / 2

println("ViewGroup Center: ($centerX, $centerY)")

注意事项

1、 View 的测量过程:如果你在 onCreateonViewCreated 方法中立即获取视图中心点,这时视图可能尚未完成测量,宽高可能为 0。为了确保视图已经完成测量,可以使用 ViewTreeObserver.OnGlobalLayoutListenerpost 方法。

  val view = findViewById<View>(R.id.your_view_id)

  view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
      override fun onGlobalLayout() {
          view.viewTreeObserver.removeOnGlobalLayoutListener(this)

          // 获取中心点
          val centerX = view.left + view.width / 2
          val centerY = view.top + view.height / 2

          println("View Center: ($centerX, $centerY)")
      }
  })

或者

  val view = findViewById<View>(R.id.your_view_id)

  view.post {
      // 获取中心点
      val centerX = view.left + view.width / 2
      val centerY = view.top + view.height / 2

      println("View Center: ($centerX, $centerY)")
  }

2、 绝对坐标和相对坐标:上述方法获取的是相对于父容器的坐标。如果你需要屏幕上的绝对坐标,可以使用 getLocationOnScreengetLocationInWindow 方法。

 val view = findViewById<View>(R.id.your_view_id)
 val location = IntArray(2)

 // 获取屏幕上的绝对位置
 view.getLocationOnScreen(location)
 val x = location[0]
 val y = location[1]

 // 计算中心点
 val centerX = x + view.width / 2
 val centerY = y + view.height / 2

 println("Absolute View Center: ($centerX, $centerY)")

通过这些方法,你可以准确获取 ViewViewGroup 的中心点,从而进行后续计算或操作。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
74 0
|
14天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
27 5
|
21天前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
21天前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
29 2
|
22天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
25天前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
18 3
|
25天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
23 2
|
1月前
|
Android开发
Android实战之如何快速实现自动轮播图
本文介绍了在 Android 中使用 `ViewPager2` 和自定义适配器实现轮播图的方法,包括添加依赖、布局配置、创建适配器及实现自动轮播等步骤。
22 0
|
1月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
21 0
|
1月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
35 3