(0,0)放置在屏幕中间的视图的坐标

时间:2016-08-17 11:36:45

标签: android android-coordinatorlayout

我将一个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());
}

2 个答案:

答案 0 :(得分:1)

好的问题是你要求视图的位置,但视图还没有被放置,你可以使用这样的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);
        }
    }
};

答案 1 :(得分:0)

您的问题可能是由于ViewGroups没有立即布置他们的孩子造成的。

您可以使用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);
        }
    });