在Android中,获取控件坐标的常见方法有几种,这里主要介绍通过 getLocationOnScreen 方法来获取控件相对于屏幕的坐标。

方法说明

  • getLocationOnScreen(int[] location) 方法可以用来获取一个视图(View)在其屏幕坐标系中的左上角位置。
  • 参数 location 是一个长度至少为2的整型数组,location[0] 会存储视图左边缘的X坐标,location[1] 会存储视图顶部边缘的Y坐标。
  • 如果需要获取视图右下角的坐标,则可以通过 location[0] + getWidth() 和 location[1] + getHeight() 来计算。

示例代码

以下是一个简单的示例,展示了如何在一个Activity中获取一个View的屏幕坐标:

import android.view.View;

public class MainActivity extends AppCompatActivity {

    private View myView;

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

        myView = findViewById(R.id.my_view); // 假设my_view是你想要获取坐标的View

        // 在窗口获得焦点后获取坐标
        myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int[] location = new int[2];
                myView.getLocationOnScreen(location);
                int x = location[0]; // 左边距离屏幕左边的距离
                int y = location[1]; // 顶部距离屏幕顶部的距离

                Log.d("COORDINATES", "View coordinates: X=" + x + ", Y=" + y);
            }
        });
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

注意事项

  • 使用 getLocationOnScreen 需要注意的是,它返回的坐标是相对于屏幕的坐标,而不是相对于父布局的坐标。
  • 如果你需要在布局绘制完成后立即获取坐标,可以在 onWindowFocusChanged 方法中调用 getLocationOnScreen,或者使用 ViewTreeObserver 的 addOnGlobalLayoutListener 来监听布局变化并获取最新的坐标值。
  • 确保在调用 getLocationOnScreen 之前视图已经被绘制到屏幕上,否则可能会得到不准确的结果。

实例

为了更具体地展示如何在Android应用中获取控件的坐标,我们可以创建一个简单的例子。假设我们有一个名为 MyActivity 的Activity,其中包含一个 Button 控件,并且我们需要在应用运行时获取这个按钮的屏幕坐标。

步骤 1: 创建布局文件

首先,在 res/layout 目录下创建一个名为 activity_my.xml 的布局文件,并添加一个 Button 控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击我获取坐标"/>

</LinearLayout>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
步骤 2: 编写Activity代码

接下来,在 src/main/java/com.example.myapp 目录下创建一个名为 MyActivity.java 的Java类,并实现获取按钮坐标的功能。

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;

public class MyActivity extends AppCompatActivity {

    private Button button;

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

        button = findViewById(R.id.button);

        // 在窗口获得焦点后获取坐标
        button.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int[] location = new int[2];
                button.getLocationOnScreen(location);
                int x = location[0]; // 左边距离屏幕左边的距离
                int y = location[1]; // 顶部距离屏幕顶部的距离

                Log.d("COORDINATES", "Button coordinates: X=" + x + ", Y=" + y);
            }
        });
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

解释

  • 布局文件 (activity_my.xml) 定义了一个简单的界面,包含一个 Button。
  • Activity代码 (MyActivity.java):
  • 设置了主布局文件 activity_my.xml。
  • 获取 Button 的引用。
  • 使用 getViewTreeObserver().addOnGlobalLayoutListener 来监听全局布局的变化,并在布局完成后获取按钮的屏幕坐标。
  • 将坐标信息输出到日志中。

运行应用

  • 运行这个应用,并查看Logcat输出,可以看到按钮的坐标信息。
  • 这样,你就能够看到按钮在屏幕上的坐标位置了。