获取View在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>


MainActivity

@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


方法一:

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

两种在onCreate中视图绘制完成时获取View位置信息,结果不为0的方法。


参考博客:http://blog.csdn.net/dangnianmingyue_gg/article/details/52021158

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值