项目是儿童教育游戏 有些动画需要XY坐标 而在oncreate获取到的是0 如何获取oncreate的坐标等 自己记录一下
View 的 getLeft() 和 getRight() 和 getTop() 和 getBottom()分别对应的是哪些坐标:
top 是左上角纵坐标,left 是左上角横坐标,right 是右下角横坐标,bottom 是右下角纵坐标
创建了一个测试项目来获取View位置,在onCreate中获取到的位置为0。
xml的内容
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" tools:context="com.pistol.viewtest.MainActivity"> <TextView android:id="@+id/tv_position" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </android.support.constraint.ConstraintLayout>
Activity代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvPosition = (TextView) findViewById(R.id.tv_position); Log.e("onCreate", "````````````````````````````````````````"); Log.e("Left", "=" + tvPosition.getLeft()); Log.e("Top", "=" + tvPosition.getTop()); Log.e("Right", "=" + tvPosition.getRight()); Log.e("Bottom", "=" + tvPosition.getBottom()); }
结果:
03-22 15:10:47.440 18055-18055/com.pistol.viewtest E/onCreate: ````````````````````````````````````````
03-22 15:10:47.440 18055-18055/com.pistol.viewtest E/Left: =0
03-22 15:10:47.440 18055-18055/com.pistol.viewtest E/Top: =0
03-22 15:10:47.441 18055-18055/com.pistol.viewtest E/Right: =0
03-22 15:10:47.441 18055-18055/com.pistol.viewtest E/Bottom: =0
如何可以在oncreate中获取呢
方法一: private void measureOne() { ViewTreeObserver vto = tvPosition.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { //防止二次调用 tvPosition.getViewTreeObserver().removeOnPreDrawListener(this); Log.e("onPreDraw", "````````````````````````````````````````"); Log.e("Left", "=" + tvPosition.getLeft()); Log.e("Top", "=" + tvPosition.getTop()); Log.e("Right", "=" + tvPosition.getRight()); Log.e("Bottom", "=" + tvPosition.getBottom()); return true; } }); }
我用的方法一
结果:
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/onPreDraw: ````````````````````````````````````````
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/Left: =413
03-22 15:10:47.506 18055-18055/com.pistol.viewtest E/Top: =803
03-22 15:10:47.506 18055-18055/com.pistol.viewtest E/Right: =668
03-22 15:10:47.506 18055-18055/com.pistol.viewtest E/Bottom: =890
方法二: private void measureTwo() { ViewTreeObserver vto = tvPosition.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //防止二次调用 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { tvPosition.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { tvPosition.getViewTreeObserver().removeGlobalOnLayoutListener(this); } Log.e("onGlobalLayout", "````````````````````````````````````````"); Log.e("Left", "=" + tvPosition.getLeft()); Log.e("Top", "=" + tvPosition.getTop()); Log.e("Right", "=" + tvPosition.getRight()); Log.e("Bottom", "=" + tvPosition.getBottom()); } }); }
结果:
03-22 15:10:47.501 18055-18055/com.pistol.viewtest E/onGlobalLayout: ````````````````````````````````````````
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/Left: =413
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/Top: =803
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/Right: =668
03-22 15:10:47.502 18055-18055/com.pistol.viewtest E/Bottom: =890
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通