为啥 view.height 比实际高度大 3 倍?

Posted

技术标签:

【中文标题】为啥 view.height 比实际高度大 3 倍?【英文标题】:Why view.height is 3 times bigger than actual height?为什么 view.height 比实际高度大 3 倍? 【发布时间】:2020-04-16 12:17:08 【问题描述】:

我有一个高度设置为 120dp 的 ImageView。当我得到 view.height 等于 360 时,为什么不等于 120?

我不确定代码是否有帮助,但是:

    <ImageView
        android:id="@+id/profilePic1"
        android:layout_
        android:layout_
        android:scaleType="centerCrop"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:clickable="true"
        app:srcCompat="@drawable/profile_pic1"/>

活动:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)

    val layoutInflater: LayoutInflater = LayoutInflater.from(this)
    val view: View = layoutInflater.inflate(R.layout.activity_edit_profile, null)

    view.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener 
        override fun onGlobalLayout() 
            // remove listener
            view.viewTreeObserver.removeOnGlobalLayoutListener(this)

            // insert coordinates (coor) of each image to imagePosition variables
            Log.d("TAG", profilePic1.height.toString()) // RETURNS 360

        
    )

【问题讨论】:

【参考方案1】:

因为在 xml 文件中您已经在 DP 中给出了大小,而在 java 中该参数返回 Pixel 中的值,请检查此以进一步了解 DP 和 PIxel

https://developer.android.com/training/multiscreen/screendensities

36x36 (0.75x) for low-density (ldpi)
48x48 (1.0x baseline) for medium-density (mdpi)
72x72 (1.5x) for high-density (hdpi)
96x96 (2.0x) for extra-high-density (xhdpi)
144x144 (3.0x) for extra-extra-high-density (xxhdpi)
192x192 (4.0x) for extra-extra-extra-high-density (xxxhdpi)

【讨论】:

【参考方案2】:

这只是因为您使用的是XXHDPI 设备,其中 120dp 正在转换为 360PX。

必读What is the difference between "px", "dip", "dp" and "sp"?


您应该阅读Image resolution for mdpi, hdpi, xhdpi and xxhdpi 以了解 DP 和像素如何协同工作。并且可以找到官方文档here


如果我简而言之,MDPI 1dp 几乎等于 1PX。因此,如果您在MDPI 分辨率的设备上检查您的代码,您将获得120PX 输出。但是当我在上面为其他分辨率添加了一个 URL 时,它遵循从 dp 到 PX 的转换规则。它会给你180px in HDPI, 240px in XHDPI, 360px in XXHDPI, 480px in XXXHDPI 设备作为输出。

【讨论】:

【参考方案3】:

在 java 中,你得到的高度是 px 而不是 dp。您必须将其转换为 dp 才能获得正确的数据:

float px = profilePic1.height;
float dp = px / context.getResources().getDisplayMetrics().density;

// here dp should be 120

【讨论】:

【参考方案4】:

有一个名为 sdp 和 ssp 的库用于使维度响应。

【讨论】:

【参考方案5】:

因为您在检索它时在代码中给出了 dp(密度像素)的高度,所以它仅以像素为单位检索。 您必须将其转换为 dp。

【讨论】:

以上是关于为啥 view.height 比实际高度大 3 倍?的主要内容,如果未能解决你的问题,请参考以下文章

为啥链接区域的高度比文本大得多?

iOS:Instruments 显示 imageio_png_data 的大小比实际图像大小大 300 倍

为啥 sys.getsizeof() 返回的值比实际大小大 33 个字节?

为啥 Visual Studio Community 2015 RC 只有4G?比VS2013小这么多。

html,body设置了高度100%,body设置了overflow:hidden,但是body实际宽度和高度都要比浏览器大...

为啥这个 numba 代码比 numpy 代码慢 6 倍?