0

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

我以像素为单位设置边框宽度,并相应地绘制它们,但是在我的 TF201 平板电脑上,当我在 TextView 上 setPadding 时,出于某种原因,即使setpadding 文档说它是明确定义的,它也会将填充宽度乘以 3 倍(以像素为单位)以像素为单位。

编辑:

即使我选择的答案不是导致我的问题的原因,它也是一个有效的答案。我的问题的真正答案实际上是来自this的副本。问题是我每次调用 setPadding 时都为我的填充添加了一个值。它确实在滚动到它的页面上被调用了 3 次。

4

2 回答 2

2

这可能是像素密度的问题。确实,setpadding 文档要求以像素为单位设置填充,但您是在设置它px还是spdp如果您阅读支持不同密度的文档,它会说,我引用:

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 单元问题 androidDraw Rectangle 改变大小 wrt 不同的 android 屏幕尺寸问题可能会有所帮助。

于 2013-07-23T01:00:51.230 回答
0

虽然该方法可能只接受像素值,但遗憾的是,这并不能让您不必考虑屏幕密度。相反,您需要根据 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());

虽然结果是 a float,但您可以轻松地将其转换为 aint以在您的setPadding(...)方法中使用。

(参考:将像素转换为 dp

于 2013-07-23T01:19:02.193 回答