Android视图的getTop()、getLeft()、getX()、getY()、getWidth()、getHeight()方法

16

我正在编写一个拖放应用程序,但由于一些参数而感到非常困惑。

请帮忙弄清楚。

首先,我阅读了 View 类的文档,并得到以下解释。

getX() : 此视图的可见 x 坐标(以像素为单位)。

getY() : 此视图的可见 y 坐标(以像素为单位)。

getWidth() : 返回视图的宽度。

getHeight() : 返回视图的高度。

getTop() : 相对于其父视图的顶部位置。

getLeft() : 相对于其父视图的左侧位置。

现在我们已经结束了官方文档,让我们看看我们有什么。

我有一个原始大小为 500x500 的图像叫做 circle。

enter image description here

这是我的应用程序的实际屏幕截图

enter image description here

这是布局的 XML。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/circle" />
</LinearLayout>
我现在关心的是,当我查看我的本地文件时,我得到了以下内容,这真的让我感到困惑。 enter image description here 我的getX()getY()函数并没有问题,因为它们实际上告诉我图像从哪里开始。
根据文档,getWidth()getHeight()方法返回视图的宽度和高度,但是监视窗口告诉我我的getWidth()getHeight()都是300,这真的让我无法理解,因为在我的XML中,我将它们设置为每个100dp。那么这些函数是否使用不同的度量单位返回它们,我该如何将其转换为dp?
最后,它告诉我getTop()getLeft()分别为700和300,根据文档,它们是图像相对于其父级的位置。但是我的父级不是线性布局吗?那么这些数字在屏幕定位方面意味着什么?
3个回答

18

这是一个为未来访问者提供的补充答案。

enter image description here

  • 左,上:当父视图布局子视图时,left是父视图左侧到子视图左侧的距离。同样,top是父视图顶部到子视图顶部的距离。因此,getLeft()getTop() 返回相对于其父视图的视图左上角的坐标(而不是在屏幕上的绝对坐标)。
  • X, Y:通常,getX()getY()将返回与getLeft()getTop()相同的值。但是,有时在已经布局完成后稍微移动视图会很有用。可以使用setTranslationX()setTranslationY()来完成此操作。如果已经设置了这些选项,则xy将与lefttop不同,其中

    x = left + translationX
    y = top + translationY
    
  • 宽度,高度: 您可以使用getWidth()getHeight()查找视图的宽度和高度。这不会受到翻译的影响。

以上值均为像素尺寸。


13

所有这些测量方法返回像素(px)大小,而不是密度像素(dp)。如果您想进行转换,可以通过调用以下方式获取密度:

float density = getResources().getDisplayMetrics().density;

然后将您得到的值除以提供的密度,例如:

int widthDp = (int)(img.getWidth() / density);

@Carmine 是的,请查看文档:http://developer.android.com/reference/android/view/View.html#getX() - Ivan Skoric

6

你可以使用以下方法从dp中获取像素:

float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());

关于定位问题。 getTopgetLeft是相对值,基于你的父元素。由于你的ImageView唯一的父元素是LinearLayout,因此你实际上是将你的ImageView定位在ActionBar/ToolBar直接下方。
另外,不要使用图片来绘制圆形,你可以使用canvas.drawCircle轻松绘制它,这样会占用更少的内存。

好的,但我仍然有一个问题。即使我按密度除以它,我得到的左边是130,如果它在屏幕的左侧,为什么它会是130dp呢? - vcmkrtchyan
1
@Carmine getLeft() 和 getTop() 方法可以获取视图相对于其父视图的位置,而在移动之前。在 XML 中,您可以将重力设置为居中,因此该视图被认为是相对于其父视图居中的。getX() 和 getY() 方法可以获取您在移动后的位置。 - Ivan Skoric
“before its moved”解释了一切)))谢谢) - vcmkrtchyan

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