Android 带换行内容的斜体文本视图似乎在右边缘剪裁文本
至少在480x800 emulator或Nexus One上,似乎从最右边的字符剪裁了几个像素 对我来说,这看起来像一个bug,但我只是一个Android初学者。 我试着在左边和右边添加边距,但它仍然在剪辑。 最后,我的破解方法是在文本的两侧添加一个空格。Android 带换行内容的斜体文本视图似乎在右边缘剪裁文本,android,textview,italic,Android,Textview,Italic,至少在480x800 emulator或Nexus One上,似乎从最右边的字符剪裁了几个像素 对我来说,这看起来像一个bug,但我只是一个Android初学者。 我试着在左边和右边添加边距,但它仍然在剪辑。 最后,我的破解方法是在文本的两侧添加一个空格。 还有其他解决方案吗?android:layout\u width=“wrap\u content”为您提供了一个矩形,用于包装内容渲染。 所有这些都适用于普通文本(非斜体) 启用斜体文本后,包装的文本将尝试放入矩形中,因此最右边的字符将被剪切
还有其他解决方案吗?android:layout\u width=“wrap\u content”为您提供了一个矩形,用于包装内容渲染。 所有这些都适用于普通文本(非斜体) 启用
斜体
文本后,包装的文本将尝试放入矩形中,因此最右边的字符将被剪切,除非其不可剪切(例如
,)
,1
等)
建议的解决方案是在文本末尾留一个空格(或其他更好的方法??)
PS:这也适用于
android:gravity=“right”
,因为文本将被推到最右边。如果我们有italic
文本,我们会面临同样的问题。我在mystrings.xml中所有字符串的末尾添加了“\”
\
是转义字符,因此我可以通过这种方式解决问题,但这种解决方案很糟糕。希望这有帮助。在文本视图的右侧添加一个3dp填充。我尝试了1dp和2dp,但3dp似乎完全做到了这一点
android:paddingRight=“3dp”
这也适用于固定宽度的文本视图,而不仅仅是“包装内容”。我不确定这个问题是否像一些评论所提到的那样是版本特定的。我在所有蜂巢版本上都看到了这个问题。据我所知,设置边距、填充、使用固定宽度或真正的斜体自定义字体都不会消除这个问题。您也可以使用(\u00A0)。只需在文本末尾添加一个额外的空格即可。在XML中,您必须将\u0020
添加到末尾,否则默认情况下,XML会忽略开头/结尾处的空白。查看源代码,我发现设置阴影会扩展剪辑矩形
一个技巧是在角色的正上方设置一个不可见的阴影
例如:
<TextView android:id="@+id/prodLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textColor="#FFFFFF"
android:textSize="30dip"
android:textStyle="italic"
android:text="Magnifico"
/>
textView.setText("Magnifico" + Html.fromHtml(" ");
我认为这个解决方案更好,因为它不会扩展文本视图的宽度,这在添加额外字符时可能会发生(在背景中更明显)。找到了另一个解决方案(在使用包装内容时在4.1.2和4.3上进行了测试)。如果扩展TextView
或EditText
类,则可以通过以下方式重写onMeasure
方法:
android:shadowRadius="2"
android:shadowDx="2"
android:shadowColor="#00000000"
这是我的解决方案:格式化textview和measure。在此之后,设置textview的宽度(1个像素),将其添加到测量的宽度
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int measuredWidth = getMeasuredWidth();
final float tenPercentOfMeasuredWidth = measuredWidth * 0.1f;
final int newWidth = measuredWidth + (int) tenPercentOfMeasuredWidth;
setMeasuredDimension(newWidth, getMeasuredHeight());
}
为我工作。希望这些帮助。您可以在字符串中添加头发空间
TextView textView = new TextView(this);
textView.setText("Text blah blah");
textView.setTypeface(typeface, Typeface.BOLD_ITALIC)
textView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
textView.setLayoutParams(new LayoutParams(textView.getMeasuredWidth() + 1,
LayoutParams.WRAP_CONTENT));
;
String hairSpace=getContext().getString(R.String.hair\u space);
textView.setText(发际空间+原始字符串+发际空间)
我也有同样的问题,通过HTML使用了一个非中断空格实体:
<string name="hair_space"> </string>
String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
合适且干净的解决方案:
使用斜体自定义字体,而不是设置textStyle='italic'
例如:
<TextView android:id="@+id/prodLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textColor="#FFFFFF"
android:textSize="30dip"
android:textStyle="italic"
android:text="Magnifico"
/>
textView.setText("Magnifico" + Html.fromHtml(" ");
我没有在常规的TextView上尝试过,但根据我的观察,问题在于textStyle='italic'
无需任何破解即可工作强>
这里有一个指责textStyle属性的证据:
我制作了一个自定义字体系列,定义了普通、粗体和斜体的字体
res/font/app\u font\u family.xml
现在,当我使用这个fontFamily并应用textStyle='italic'时,最右边的字符仍然被剪裁
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font app:fontStyle="normal" app:fontWeight="400" app:font="@font/roboto_regular"/>
<font app:fontStyle="italic" app:fontWeight="400" app:font="@font/roboto_italic" />
<font app:fontStyle="normal" app:fontWeight="700" app:font="@font/roboto_medium"/>
</font-family>
这是Api 23上的支持库28.0.0和Android Studio 3.2。在我看来,如果以编程方式应用斜体,它可以正确地包装内容。因此,手动设置TextView的字体,例如在kotlin中:
<android.support.v7.widget.AppCompatTextView
android:text="yolO"
app:fontFamily="@font/app_font_family"
android:textStyle='italic' />
虽然我通常更喜欢使用真正的斜体字体,但这些字体并不总是可用。
由于当前的问题是由于对文本边界的错误测量造成的,我只设置了android:layout\u width=“0dp”
,为文本视图提供了所需的水平空间。这在所有情况下可能都不理想,但在许多情况下,这是一个简单且不太老套的解决方案。你能发布你所看到的图像吗?看到你提到的最右边的“o”页边距了吗?你的意思是填充吗?这个问题也是窃听方法。这是唯一可靠的解决方法。如果使用资源字符串,尾随空格将被删除(为什么会这样做?),因此没有任何效果,但斜杠会解决这个问题。我不认为这是XML的转义字符,至少我在这里没有看到它:但这对我来说确实有效!我想知道为什么。填充似乎不会影响文本剪辑rect,至少在2.3上不会。应用程序的标题(在我的例子中是ActionBarSherlock)也是如此,这使得自定义标题文本视图变得不那么简单。但是感谢您的尝试。使用setTextSkewX(这是另一种斜体化文本的方法)也有同样的问题。这也解决了这个问题。编辑:删除DIPST这很好,谢谢!我讨厌谷歌强迫我们做的这些黑客行为!在API 24中不推荐使用fromHtml(字符串)。这是一个合适的解决方案,而不是一个黑客程序。现在,通过在XML中设置真正的斜体字体,它确实消失了。谢谢你的提示。检查我的答案。最好的解决方案这是难以置信的。。。为什么,安卓先生?告诉我这是一个bug,它会被修复的。。