【问题标题】:App Hangs while Scaling Bitmap in Canvas在画布中缩放位图时应用程序挂起
【发布时间】:2015-01-04 10:12:28
【问题描述】:

Bitmap上绘制文字

public Bitmap textAsBitmap(String text, float textSize, int textColor) {
    m_paint.setTextSize(textSize);
    m_paint.setColor(textColor);
    m_paint.setTextAlign(Paint.Align.LEFT);
    int width = (int) ( m_paint.measureText(text) + 0.5f);  // round
    float baseline = (int) (- m_paint.ascent() + 0.5f); // ascent() is negative
    int height = (int) (baseline +  m_paint.descent() + 0.5f);         
    final  Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
    canvas1.setBitmap(image);
    canvas1.drawText(text, 0, baseline, m_paint);        
    return image;
}

第 2 步 - 绘制画布

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();

    if (CustomTextview.GetDB().size() != 0) {
        for (CustomTextview textview : CustomTextview.GetDB()) {
            scale = textview.GETSCALE();
          final  Bitmap bitmap= textAsBitmap(textview.text,textview.size*scale,textview.color);
            if (bitmap!=null)
            canvas.drawBitmap(bitmap, textview.X, textview.Y, textview.paint);
      }       
    }
    canvas.restore();

}

我正在使用缩放监听器来缩放位图。但是一旦缩放,它会在 5 到 10 分钟后挂起..

【问题讨论】:

  • 什么是“位图 b= Bitmap.createBitmap(image);”为了?而不是“b”,只需使用“image”
  • 这不起作用。使用直接画布时背景会产生模糊效果
  • @pskink 现在检查问题。我已编辑..
  • textAsBitmap 是干什么用的?为什么不使用 Canvas api 绘制文本?
  • 你可以在没有位图画布的情况下绘制文本吗?

标签: android canvas bitmap draw


【解决方案1】:

您可以直接在 Canvas 上简单地绘制文本,而无需先创建位图。

为此,请创建一个具有正确配置的画图,计算绘制文本时的大小,然后将文本本身直接绘制到画布上。

Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setAntiAlias(true);
textPaint.setFakeBoldText(true);
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(30f);


String myText = "This is a test";
Rect textBounds = new Rect();
textPaint.getTextBounds(myText, 0, myText.length(), bounds);

canvas.drawText(myText, 0, myText.length() rect.width()/2, rect.height()/2, textPaint);

上面的代码会将文本居中绘制,但您可以轻松更改此设置以满足您自己的需要。

【讨论】:

  • 那个也挂了。当你画的时候文字尺寸变大了
  • 它实际挂在哪一行?另外,我真的不明白为什么你应该打电话给canvas.save()canvas.restore()。你能去掉那些电话吗?
  • 我认为这不会造成问题?
  • 每当我放大文本时。挂了
  • @jmlos 理解这个问题。它不是关于绘制文本。当它很大时它会挂起
【解决方案2】:

你可以试试这个。

android:largeHeap="true"

AndroidMenifest.xml 中的应用程序内部。比如

<application
           android:largeHeap="true" >
</application>

希望能正常工作。谢谢

【讨论】:

  • 对不起,我不想尝试这个。不建议也使用
【解决方案3】:

它挂起的原因可能是因为以这种方式创建大量位图会很快导致内存不足。 如果您真的需要位图,您可以创建一个位图并重复使用它。更好的可能是直接使用画布 api 的其他建议解决方案。您甚至可以使用单个 Paint 实例来避免内存开销。

【讨论】:

  • 。我正在绘制多个文本。我也有 treid canvas api。我不知道它也挂起。我在使用 canvas 时检查过。没有内存错误。gpu 在我的某个时候被击中放大和缩小
  • 如果你看到一些内存泄漏的引用,我认为这是在你的 logcat 中检查的正确解决方案。
  • 我已经检查了有没有办法重复使用位图?
  • 创建一次并将其作为您班级的成员。
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多