为什么我的TextView填充无法预测像素



我扩展了TextView并添加了对边框的支持,问题是当我绘制边框时,我需要在带边框的一侧添加填充,这样文本就会移动。

我以像素为单位设置了边框宽度,它会相应地绘制边框,但在我的TF201平板电脑上,当我在TextView上设置padding时,出于某种原因,它会将填充宽度乘以像素的3倍,尽管setPadding文档说它是以像素显式定义的。

编辑:

尽管我选择的答案不是导致我问题的原因,但它是一个有效的答案。我的问题的真正答案实际上是重复的。问题是,每次调用setPadding时,我都会在填充中添加一个值。在一个滚动到它的页面上,它确实被调用了三次

这可能是像素密度的问题。setpadding-docs确实要求以像素为单位设置填充,但您是在pxsp还是dp中设置它?如果你阅读了支持不同密度的文件,它说,我引用:

Different screens have different pixel densities,so the same number of pixels may correspond to different physical sizes on different devices.

因此,当您指定两个视图之间的间距时,请使用dp而不是px:

<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

指定文本大小时,始终使用sp:

<TextView android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="20sp" />

此外,根据您的评论:

drawRect单元发布android和Draw Rectangle,改变大小w.r.t不同的android屏幕大小问题可能会有所帮助。

虽然该方法可能只接受像素值,但遗憾的是,这并不能避免您需要考虑屏幕密度。相反,您需要根据DP来确定值,然后在运行时以编程方式计算像素当量。幸运的是,有一些内置的方法可以帮助您。这可以用以下代码完成:

/// Converts 14 dip into its equivalent px
int dimensionInDp = 14;    
Resources r = getResources();
float dimensionInPixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dimensionInDp, r.getDisplayMetrics());

尽管结果是float,但您可以很容易地将其转换为int,以便在setPadding(...)方法中使用。

(参考:将像素转换为dp)

最新更新