【问题标题】:Text being cut off from front for a particular font特定字体的文本从前面被截断
【发布时间】:2015-04-19 01:14:33
【问题描述】:

us denealian cursive font将换行中每个单词的首字母截断。

看这张带有填充的图片。如果我不使用任何填充,它将像图片 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"
    />

这里的写作助手是一个扩展 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 的左侧放置一些额外的空间?

【问题讨论】:

  • 你能把canvas.drawLine的参数发给我吗(r.left - padding, baseline, r.right + padding, baseline, paint);这……
  • 写线助手仅用于隐藏文本我不认为它与此有关,因为我尝试没有助手并且结果是相同的。无论如何这是参数 mRect =新矩形(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(2); mPaint.setColor(0xFF03B9FF);

标签: android fonts textview


【解决方案1】:

最后我解决了这个问题..这是一个字体问题,我不确定它是否可以通过任何其他方式修复。所以我所做的是,首先获取 TextView 布局并获取结束和开始每行,因此在每行中获取字符串。现在在每行前面附加空格。这是整个代码。可能会帮助其他人。

    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++;
    }

【讨论】:

    【解决方案2】:

    我提出了类似的解决方案。这会递归地在行首和行尾添加空格,如果在添加空格时单词转到此解决方案下方的行,则会自行修复错误。 (前 3 个变量具有类作用域)。

        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);
    }   
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2012-04-10
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多