打赏

项目是儿童教育游戏 有些动画需要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

 

posted @   YY2000  阅读(135)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示