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>
@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.youkuaiyun.com/dangnianmingyue_gg/article/details/52021158