在安卓系统中查找视图在显示器(屏幕)上的位置

10
我想找到视图在显示屏上的位置。
为了实现这个目标,我使用诸如view.getLeft()view.getBottom()view.getRight()view.getTop()等方法。但不幸的是,所有这些方法都返回了0
是否有其他方法可以查找视图的位置(即屏幕坐标)?
我的布局main.xml:
<TextView android:id="@+id/tv1"
    android:layout_width="200px"
    android:layout_height="30px"
    android:text="welcome to" />

<TextView android:id="@+id/tv2"
    android:layout_width="200px"
    android:layout_height="30px"
    android:text=" Make Eit solution " />

我的类在 onCreate() 方法中有这样的代码:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);

System.out.println("tv4 width:"+tv2.getWidth());
System.out.println("tv4 height:"+tv2.getHeight());
System.out.println("Right:"+tv2.getRight());
System.out.println("Left:"+tv2.getLeft());
System.out.println("Top:"+tv2.getTop());
System.out.println("Bottom:"+tv2.getBottom());

这里我找到了答案。获取视图的坐标 - RajaRaviVarma
5个回答

9
最简单的方法是使用View.getLocationOnScreen();getLocationInWindow();来获取它。
如果你想要相对于根布局的位置,那么可以参考这里

6

你所编写的方法足以在屏幕上找到位置,但是你编写的地方不正确。

请尝试在onWindowFocusChanged(boolean hasFocus)方法中编写方法(view.getLeft()、view.getTop()等)。

例如...

**

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
                System.out.println("Right:"+tv2.getRight());
                System.out.println("Left:"+tv2.getLeft());
                System.out.println("Top:"+tv2.getTop());
        }
    }

它将解决您的问题。


1
这是对这个问题的完美答案。+1 - Mohsen Kamrani

6
使用getLeft()getRight()getTop()getBottom()方法。这些方法可以在视图实例化后使用。

33
这些方法给出了视图相对于其父级的位置。 - ilkinulas
@ilkinulas 那么相对于设备的解决方案是什么? - Royi Namir

3

您无法预先获得视图。如果可能的话,您可以使用invalidate()进行显式操作,或者在onPostResume()onResume()函数中检查此内容。

如果您只是想尝试一些东西并希望通过线程来玩耍,那么这个代码块将把您的代码放到UI线程上,并等待所有内容被渲染后再显示您的代码:

final View gv = this;
ViewTreeObserver vto = gv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @SuppressLint("NewApi")
    public void onGlobalLayout() {
        gv.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        tv1=(TextView)findViewById(R.id.tv1);
        tv2=(TextView)findViewById(R.id.tv2);
        System.out.println("tv4 width:"+tv2.getWidth());
        System.out.println("tv4 height:"+tv2.getHeight());
        System.out.println("Right:"+tv2.getRight());
        System.out.println("Left:"+tv2.getLeft());
        System.out.println("Top:"+tv2.getTop());
        System.out.println("Bottom:"+tv2.getBottom());
}

这最后一种方法需要很大的努力,但可以完成工作。我通常会把类似这样的行写在日志中(例如android.util.Log)。

getLeft()getRight()不总是有效,因为它们返回相对于父级而非屏幕的位置。 - Mallika Khullar

2

我不确定您能否在布局阶段完成之前获得视图的位置。一旦视图被布置,您可以使用getLocationOnScreen来获取视图的位置。getTop及其类似函数仅返回视图在其父元素中的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接