(0,0) 位于屏幕中间的视图的坐标

(0,0) coordinates of a view that is placed in the middle of the screen

我在屏幕中央放置了一个 ImageView(为此我使用了 android:layout_centerInParent="true")。但是当我调用方法 getX()getY() 时,我都收到 0(零)。

我认为问题是 xml 属性 android:layout_centerInParent="true"。即它实际上并没有改变视图在屏幕上的位置。

这里是 xml 文件内容:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fundal">
    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/imageView"
        android:src="@drawable/playbtn"
        android:layout_centerInParent="true" />
</RelativeLayout>

这里是我调用方法的地方:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drag);

    ImageView img =(ImageView)findViewById(R.id.imageView);

    Log.d("DEBUG_TAG", "Coordinates: "+img.getX()+" "+img.getY());
}

您的问题可能是因为 ViewGroup 没有立即布局其子项。

您可以使用 globalLayoutListener 来查看您的视图何时完全初始化并设置了坐标。

// view will be the parent view containing your ImageView.
view.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Here you can call the getX() and getY()...

            // Don't forget to remove your listener when you are done with it.
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });

好的,问题是您正在询问视图的位置,但视图尚未布置,您可以使用这样的 OnGlobalLayoutListener

final View rootView = findViewById(R.id.root_view);
final ImageView img = (ImageView) findViewById(R.id.image_view);
ViewTreeObserver viewTreeObserver = rootView.getViewTreeObserver();
ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        Log.d("DEBUG_TAG", "Coordinates: "+img.getX()+" "+img.getY());

        if (Build.VERSION.SDK_INT < 16) {
            rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        } else {
            rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    }
};