【问题标题】:Android view's getTop(), getLeft(), getX(), getY(), getWidth(), getHeight() methodsAndroid 视图的 getTop()、getLeft()、getX()、getY()、getWidth()、getHeight() 方法
【发布时间】:2015-07-24 00:09:01
【问题描述】:

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

请帮忙解答一下。

首先,我阅读了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>

现在我在担心什么。当我看我的本地人时,我得到以下内容,这真的让我感到困惑。

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

正如文档所述,getWidth() 和 getHeight 方法返回视图的宽度和高度,但监视窗口告诉我我的 getWidth() 和 getHeight 是 300,我真的无法理解,因为在我的 XML 中我已经将它们设置为 100dp,所以函数会以不同的测量值返回它们,以及如何将其转换为 dp。

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

【问题讨论】:

    标签: android view layoutparams


    【解决方案1】:

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

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

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

    以上数值均为像素尺寸。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      【解决方案3】:

      你可以从 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());
      

      关于定位问题。 getTop 和 getLeft 是相对值,基于您的父母。由于您的ImageView 的唯一父级是LinearLayout,因此您有效地将ImageView 直接定位在ActionBar/ToolBar 下方

      同样不要将图像用于圆形,您可以使用canvas.drawCircle 轻松绘制它,它占用的内存要少得多。

      【讨论】:

      • 好的,但是我还有一个问题,即使我除以密度,我得到的左边是 130,如果它在屏幕的左侧,怎么会是 130 dp?
      • @Carmine getLeft() 和 getTop() 在移动之前为您提供视图相对于其父级的位置,在 xml 中您将重力设置为中心,因此它被认为在父级中居中.. getX () 和 getY() 在你移动后给你位置
      • before its moved 这句话解释了一切)))谢谢)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2012-05-30
      • 2012-12-11
      • 1970-01-01
      • 2015-05-02
      • 2013-03-30
      相关资源
      最近更新 更多