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

Car*_*ine 13 android view layoutparams

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

请帮忙搞清楚.

首先,我阅读了该View课程的文档并得到了以下解释.

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叫做圆圈.

在此输入图像描述

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

在此输入图像描述

这是布局的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>
Run Code Online (Sandbox Code Playgroud)

现在我关心的是什么.当我看到我的当地人时,我得到以下内容,这让我很困惑.

在此输入图像描述

我没有看到getX()getY()函数有任何问题,因为它们实际上显示了图像的开始位置.

作为文档状态,则getWidth()getHeight方法返回的宽度和视图的高度,但在监视窗口告诉我,我getWidth()getHeight是300,我实在无法理解,因为在我的XML,我将它们100dp每个,所以做函数以不同的度量返回给我,如何将其转换为dp.

最后,它告诉我,getTop()并且getLeft是700和300,正如文档所说,它们是图像相对于它的父级的位置.但是我的父母不是线性布局,那么这个数字对于屏幕定位意味着什么呢?

Iva*_*ric 9

所有这些测量方法都返回像素(px)的大小,而不是密度像素(dp).如果你想转换它,你可以通过调用以获得密度:

float density = getResources().getDisplayMetrics().density;
Run Code Online (Sandbox Code Playgroud)

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

int widthDp = (int)(img.getWidth() / density);
Run Code Online (Sandbox Code Playgroud)


Sur*_*gch 6

这是对未来访客的补充答案。

在此处输入图片说明

  • 左上:当父视图布置子视图时,left是从父视图的左侧到子视图的左侧的距离。同样,top是从父视图的顶部到子视图的顶部的距离。因此,getLeft()getTop()视图相的左上角的坐标返回其父视图(未在画面上绝对坐标)。
  • X,Y:通常getX()getY()将返回与getLeft()和相同的东西getTop()。但是,有时在将视图布置好后将其稍微移动会很有用。这可以通过setTranslationX()和来完成setTranslationY()。如果这些已设置则xy将不同于left并且top,其中

    x = left + translationX
    y = top + translationY
    
    Run Code Online (Sandbox Code Playgroud)
  • 宽度,高度:您可以找到宽度,并与视线的高度getWidth()getHeight()。这不受翻译的影响。

以上数值均为像素尺寸。


Boj*_*man 5

您可以从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());
Run Code Online (Sandbox Code Playgroud)

截至定位问题. getTop并且getLeft是相对值并且基于您的父级.既然你的唯一的父母ImageViewLinearLayout你有效地定位你的ImageView正下方ActionBar/ToolBar

也不要使用圆形图像,你可以使用canvas.drawCircle轻松地绘制它需要更少的内存.