特定字体的文本从前面被截断
Text being cut off from front for a particular font
为了 us denealian 草书字体.
,新行上每个单词的第一个字母被截断
看这张图片 padding.If 我没有使用任何填充,它会像图 2
这是我的代码
<com.font.anything.writinghelper
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000000"
android:padding="20dip"
android:textSize="60sp"
android:text="japanese google donkey elephant ostrich"
/>
这里的写作助手是class扩展textview只是为了在文本下划线
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Rect r = mRect;
int padding =55;
Paint paint = mPaint;
int count = getLineCount();
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
canvas.drawLine(r.left - padding, baseline, r.right + padding,
baseline, paint);
}
super.onDraw(canvas);
}
有人能帮忙吗?
编辑
要求截图
有没有办法在 TextView 的左侧放置一些额外的 space ?
最后我解决了这个问题..这是一个字体问题,我不确定它是否可以被任何其他人修复way.So我所做的是,首先获取 TextView 布局并获取每行的结束和开始,因此在每个 line.Now 中获取字符串,在每行前面附加 space。这是整个 code.May 帮助别人。
ArrayList<String> lines = new ArrayList<String>();
ArrayList<String> newLines = new ArrayList<String>();
String line="";
String text = getText().toString();
Layout layout = getLayout();
int start=0;
int end;
for (int i=0; i<count; i++) {
end = layout.getLineEnd(i);
lines.add(text.substring(start,end));
line = lines.get(i);
start = end;
String nwText = "";
nwText = " "+ line+" ";
newLines.add(nwText);
}
Paint mPaint = getPaint();
int i = 0;
// String[] textLines = Results.split("\n+");
//float textsize = getTextSize();
for (String textLine : newLines)
{
// mPaint.setTextSize(textsize);
int baseline = getLineBounds(i, r);
canvas.drawText(textLine, 0, baseline, mPaint);
i++;
}
我想出了一个类似的解决方案。这递归地将 spaces 添加到行的开头和结尾,并且如果在添加 space 时单词转到此解决方案下面的行会自行修复错误。
(前 3 个变量具有 class 范围)。
row = 0;
offset = 0;
oldPos = -1;
final String nonBreakingSpace = "\u00A0\u00A0";
textV.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int pos;
StringBuilder sb = new StringBuilder(textV.getText());
pos = textV.getLayout().getLineStart(row);
if (oldPos!=-1 && pos<oldPos)
{
sb.delete(oldPos, oldPos + nonBreakingSpace.length());
}
if (offset==0)
{
row++;
offset = -1;
}
else
{
offset = 0;
}
final int lineCount = textV.getLayout().getLineCount();
pos = textV.getLayout().getLineStart(row);
oldPos = pos+offset;
if (row>=lineCount)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
removeLayoutListenerPre16(textV.getViewTreeObserver(), this);
} else {
removeLayoutListenerPost16(textV.getViewTreeObserver(), this);
}
sb.insert(0, nonBreakingSpace);
sb.insert(sb.length(), nonBreakingSpace);
}
else
{
sb.insert(pos+offset, nonBreakingSpace);
}
textV.setText(sb);
}
});
和:
@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeGlobalOnLayoutListener(listener);
}
@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeOnGlobalLayoutListener(listener);
}
为了 us denealian 草书字体.
看这张图片 padding.If 我没有使用任何填充,它会像图 2
这是我的代码
<com.font.anything.writinghelper
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000000"
android:padding="20dip"
android:textSize="60sp"
android:text="japanese google donkey elephant ostrich"
/>
这里的写作助手是class扩展textview只是为了在文本下划线
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Rect r = mRect;
int padding =55;
Paint paint = mPaint;
int count = getLineCount();
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
canvas.drawLine(r.left - padding, baseline, r.right + padding,
baseline, paint);
}
super.onDraw(canvas);
}
有人能帮忙吗?
编辑
要求截图
有没有办法在 TextView 的左侧放置一些额外的 space ?
最后我解决了这个问题..这是一个字体问题,我不确定它是否可以被任何其他人修复way.So我所做的是,首先获取 TextView 布局并获取每行的结束和开始,因此在每个 line.Now 中获取字符串,在每行前面附加 space。这是整个 code.May 帮助别人。
ArrayList<String> lines = new ArrayList<String>();
ArrayList<String> newLines = new ArrayList<String>();
String line="";
String text = getText().toString();
Layout layout = getLayout();
int start=0;
int end;
for (int i=0; i<count; i++) {
end = layout.getLineEnd(i);
lines.add(text.substring(start,end));
line = lines.get(i);
start = end;
String nwText = "";
nwText = " "+ line+" ";
newLines.add(nwText);
}
Paint mPaint = getPaint();
int i = 0;
// String[] textLines = Results.split("\n+");
//float textsize = getTextSize();
for (String textLine : newLines)
{
// mPaint.setTextSize(textsize);
int baseline = getLineBounds(i, r);
canvas.drawText(textLine, 0, baseline, mPaint);
i++;
}
我想出了一个类似的解决方案。这递归地将 spaces 添加到行的开头和结尾,并且如果在添加 space 时单词转到此解决方案下面的行会自行修复错误。 (前 3 个变量具有 class 范围)。
row = 0;
offset = 0;
oldPos = -1;
final String nonBreakingSpace = "\u00A0\u00A0";
textV.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int pos;
StringBuilder sb = new StringBuilder(textV.getText());
pos = textV.getLayout().getLineStart(row);
if (oldPos!=-1 && pos<oldPos)
{
sb.delete(oldPos, oldPos + nonBreakingSpace.length());
}
if (offset==0)
{
row++;
offset = -1;
}
else
{
offset = 0;
}
final int lineCount = textV.getLayout().getLineCount();
pos = textV.getLayout().getLineStart(row);
oldPos = pos+offset;
if (row>=lineCount)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
removeLayoutListenerPre16(textV.getViewTreeObserver(), this);
} else {
removeLayoutListenerPost16(textV.getViewTreeObserver(), this);
}
sb.insert(0, nonBreakingSpace);
sb.insert(sb.length(), nonBreakingSpace);
}
else
{
sb.insert(pos+offset, nonBreakingSpace);
}
textV.setText(sb);
}
});
和:
@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeGlobalOnLayoutListener(listener);
}
@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeOnGlobalLayoutListener(listener);
}