【问题标题】:Drawing Text on a Canvas in a loop在画布上循环绘制文本
【发布时间】:2017-07-27 09:22:45
【问题描述】:

我有一个很长的字符串,我确信它不适合图像。所以我最终计算了行数,然后使用CanvasBitmap 上逐行写入。问题是只写了第一行。我会一直写在这张图片上。每行的长度固定为 40 个字符。请检查以下代码:

private Bitmap prepareImageWithText(String text){
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.text_image); // Load your bitmap here
        Bitmap aBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); // copy the bitmap because the one from the Resources is immutable.
        Canvas canvas = new Canvas(aBitmap);
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(75);

        for(int i=0; i<calculateLines(text); i++) {
            int beginFrom = i*40;
            int endAt = beginFrom + 40;
            if(endAt > text.length()){
                endAt = text.length()-1;
            }
            String writableArea = text.substring(beginFrom, endAt);
            canvas.drawText(writableArea, 100, 300+(i*100), paint);
            canvas.save();
        }
        return aBitmap;
    }

   private int calculateLines(String text){
        if(!TextUtils.isEmpty(text)){
            int lines = text.length()/40;
            return lines;
        }
        return 1;
    }

【问题讨论】:

  • 只需使用android.text.Layout
  • @pskink 你能解释一下吗?
  • @NaveenDissanayake Math.roof? roof 你在说什么?就算是Math.ceil,跟问题有什么关系?
  • @NaveenDissanayake 啊好吧,我错过了他使用的是i&lt;calculateLines(text) 而不是i&lt;=calculateLines(text)
  • 只需使用Layout 只需两行安全代码,而不是几十行...

标签: java android canvas png


【解决方案1】:
for(int i=0; i<calculateLines(quote); i++) {

if(endAt > text.length()){

这两行需要您注意。 “text”和“quote”是同一个String吗?

【讨论】:

  • 它们是一样的,只是格式错误。我想我现在已经解决了这个问题。
  • @Ichthyocentaurs 这不是格式错误。您需要解释您的问题,否则我们试图帮助您是不明智的。
  • 真的很抱歉造成混乱,我已经更正了所有的变量名。但真正的问题是循环迭代次数的计算不正确。
【解决方案2】:

你将quote 传递给calculateLines 并且只有当它不为空时你才在做任何事情,然而,你在那里使用mQuotelength。我认为这种混乱是你的问题的原因。您需要确保您传递的值是您想要传递的值,并在计算中使用quotelength 而不是mQuotelength

【讨论】:

  • mQuote 和quote 是一样的。只是一个格式错误。
  • @Ichthyocentaurs 什么是引用,它是如何初始化的,当方法被调用时它的值是多少?
  • prepareImageWithText(String text),接收文本作为输入。并调用 calculateLines() 将其作为输入接收。
  • @Ichthyocentaurs calculateLines 接收引号作为输入,prepareImageWithText 不将其参数文本传递给它。如果您需要任何帮助,请使用您的真实代码编辑您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多