【问题标题】:canvas drawtext with multiline带有多行的画布绘制文本
【发布时间】:2015-04-25 18:10:33
【问题描述】:

我正在开发一个图像评论应用程序。我用canvas.drawText(text, x, y, imgPaint);在画布上绘制文本

这出现在一行中。当文本跨越画布宽度时,我需要将行换成多行

提前致谢

【问题讨论】:

    标签: android canvas drawtext


    【解决方案1】:

    你需要使用StaticLayout:

    TextPaint mTextPaint=new TextPaint();
    StaticLayout mTextLayout = new StaticLayout("my text\nNext line is very long text that does not definitely fit in a single line on an android device. This will show you how!", mTextPaint, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
    
    canvas.save();
    // calculate x and y position where your text will be placed
    
    textX = 100;
    textY = 100;
    
    canvas.translate(textX, textY);
    mTextLayout.draw(canvas);
    canvas.restore();
    

    【讨论】:

    • 嘿,很好的处理方式。但是,当我必须将大文本拆分为页面并在画布上绘制时,如何解决这个问题?任何建议表示赞赏。
    【解决方案2】:

    您需要分割线并分别绘制每个片段,并根据字体高度增加 y。

    例如:

    var lines = text.split("\n"),
        x = 100, y = 100, fHeight = 16, // get x, y and proper font or line height here
        i = 0, line;
    
    while(line = lines[i++]) {
        canvas.drawText(line, x, y, imgPaint);
        y += fHeight;
    }
    

    【讨论】:

    • 我认为 OP 更关心确定换行符,而不是多行方面。
    【解决方案3】:

    好吧,添加另一个答案已经很晚了,但是如果有人不想使用 StaticLayout,那么他们可以尝试我的多行文本逻辑

    注意:这段代码用在View的onSizeChanged()方法中,textArray是一个类变量,存储每一行​​

    //This array will store all the words contained in input string
                val wordList = ArrayList<String>()
    
                //Temporary variable to store char or string
                var temp = ""
    
                it.trim().forEachIndexed { index, letter ->
                    //Adding each letter to temp
                    temp += letter
    
                    //If letter is whiteSpace or last char then add it to wordList.
                    //For example : Let input be "This is a Info text"
                    //              since there is no whiteSpace after that last 't' then the last word
                    //              will not be added to wordList there for checking for last letter is required
                    //NOTE: the whiteSpace is also included in that word
                    if (letter.isWhitespace() || index == it.length -1 ) {
                        wordList.add(temp)
                        //Resetting temp
                        temp = ""
                    }
                }
    
                wordList.forEachIndexed { index, word ->
                    //Measuring temp + word to check if their width in pixel is more than or equal to
                    // the view's width + 60px(this is used so that word there is some space after each line. It can be changed)
                    if (textPaint.measureText(temp + word) >= w - 60) {
                        textArray.add(temp)
    
                        //If adding last word to temp surpasses the required width then add the last word
                        // separately since the loop will be terminated after that
                        if (index == wordList.size - 1){
                            textArray.add(word)
                            return@forEachIndexed
                        }
    
                        //Resetting temp
                        temp = ""
                    } else if (index == wordList.size - 1) {
                        //If adding last word to temp doesn't surpasses the required width the add that
                        // line to list
                        textArray.add(temp + word)
                        return@forEachIndexed
                    }
    
                    //Adding word to temp
                    temp += word
                }
    

    然后在 onDraw() 方法中

      textArray.forEachIndexed { index, singleLine ->
                        //x is set to 16f so that there is some space before first word
                        //y changes with each line i.e 1st line will be drawn at y = 60f, 2nd at 120f and so on
                        it.drawText(singleLine, 16f, (index + 1) * 60f, textPaint)
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2021-02-14
      • 2013-01-10
      • 2011-10-28
      相关资源
      最近更新 更多