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

Android view's getTop(), getLeft(), getX(), getY(), getWidth(), getHeight() methods

我正在编写一个拖放应用程序,并且因为一些参数而感到非常困惑。

请大家帮忙解答

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

getX() : The visual x position of this view, in pixels.

getY() : The visual y position of this view, in pixels.

getWidth() : Return the width of the your view.

getHeight() : Return the width of the your view.

getTop() : Top position of this view relative to its parent.

getLeft() : Left position of this view relative to its parent.

现在我们完成了官方文档,让我们看看我们有什么。

我有一张原始尺寸为 500x500 的图片,名为 circle。

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

这里是布局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>

现在我在担心什么。当我看当地人时,我得到以下信息,这让我很困惑。

我没有发现 getX()getY() 函数有任何问题,因为它们实际上告诉我图像从哪里开始。

如文档所述,getWidth()getHeight 方法 return 视图的宽度和高度,但手表 window 告诉我我的 getWidth()getHeight 是 300,我真的无法理解,因为在我的 XML 中我将它们设置为每个 100dp,因此函数 return 我以不同的方式测量它们,以及如何将其转换为 dp。

最后,它告诉我 getTop()getLeft 是 700 和 300,正如文档所说,它们是图像相对于 parent 的位置。但是我的 parent 不是线性布局,所以这些数字在屏幕定位方面意味着什么?

所有这些测量方法 return 大小以像素为单位(px),而不是密度像素(dp)。如果你想转换它,你可以通过调用获得密度:

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

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

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

您可以使用

从 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 是相对值,基于您的 parent。由于您的 ImageView 中唯一的 parent 是 LinearLayout,您实际上是将 ImageView 直接定位在 ActionBar/ToolBar

下方

也不要使用图像作为圆圈,您可以使用 canvas.drawCircle 轻松绘制它,它占用的内存要少得多。

这是给未来访客的补充回答。

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

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

以上数值均为像素尺寸