我扩展了TextView并添加了对边框的支持,问题是当我绘制边框时,我需要在带边框的一侧添加填充,这样文本就会移动。
我以像素为单位设置了边框宽度,它会相应地绘制边框,但在我的TF201平板电脑上,当我在TextView上设置padding时,出于某种原因,它会将填充宽度乘以像素的3倍,尽管setPadding文档说它是以像素显式定义的。
编辑:
尽管我选择的答案不是导致我问题的原因,但它是一个有效的答案。我的问题的真正答案实际上是重复的。问题是,每次调用setPadding时,我都会在填充中添加一个值。在一个滚动到它的页面上,它确实被调用了三次
这可能是像素密度的问题。setpadding-docs确实要求以像素为单位设置填充,但您是在px
、sp
还是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)