在主屏幕小部件上使用画布绘制

时间:2012-05-10 09:06:38

标签: android android-widget bitmap imageview android-canvas

我想要的输出:

具有自定义字体的小部件(主屏幕小部件)上的文本

我的问题:

  • 无法在窗口小部件中的textview上使用自定义字体(因为在窗口小部件中无法直接访问TextView,我们必须使用远程视图来使用它们。)

所以我想使用imageview并使用canvas在位图上绘制文本,然后在imageview上设置这个位图。到目前为止,一切正常,但只有两件事。

我不知道,

  • 如何让我的文字在中心垂直和水平设置? (垂直和水平意味着,垂直和水平都在中心)

  • 如何让我的文字填满整个位图空间?

我使用以下代码在小部件上显示一些文字。

Bitmap bitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint();

paint.setColor(Color.YELLOW);
canvas.drawPaint(paint);

paint.setColor(Color.GREEN);
paint.setStyle(Style.FILL);

canvas.drawText("Test", 50, 50, paint);

以下是输出。 enter image description here

3 个答案:

答案 0 :(得分:1)

1-在小部件中的textview上设置字体运行时

I dont know that either

2-将文本设置在中心并填充容器

Please see the following code:

 float size = 1.0f;

 Bitmap bitmap = Bitmap.createBitmap(200, 200, Config.ARGB_8888);

 Canvas canvas = new Canvas(bitmap);

 Paint paint = new Paint();

 paint.setColor(Color.YELLOW);
 canvas.drawPaint(paint);

 paint.setColor(Color.GREEN);
 paint.setStyle(Style.FILL);

 Rect rect = new Rect();
 paint.getTextBounds("Test", 0, 4, rect);

 float width = 1.0f;

 while (width<200 && rect.height()<200)
 {
  size++;
  paint.setTextSize(size);

  width = paint.measureText("Test");
  paint.getTextBounds("Test", 0, 4, rect);

 }

 size--;
 paint.setTextSize(size);

 canvas.drawText("Test", 100-width/2, 100+rect.height()/2, paint);

我试图附加屏幕截图,但它不允许我添加,因为我是新用户。(菜鸟:P)

谢谢,

答案 1 :(得分:0)

  1. 无法在小部件中的textview上使用自定义字体

    TextView tv=(TextView)findViewById(R.id.custom);
    Typeface face=Typeface.createFromAsset(getAssets(),"fonts/Verdana.ttf");
    tv.setTypeface(face);
    

    如果你想在画布中使用相同的颜色,那么将面部设置为绘制使用的obj。

  2. 如何让我的文字在中心垂直和水平设置?

  3. 在画布中作为绘图文本的绘画对象。然后你可以设置paint obj

    mPaint.setTextAlign(Align.CENTER);
    
  4. 或者您可以向左或向右放置。您不能垂直或水平设置,因为您绘制文本,以便您可以垂直或水平绘制。

    示例您需要绘制文本SAM

    1. 水平表示canvas.drawText(“SAM”,50,50,paint);

    2. 真实地意味着

             canvas.drawText("S", 50, 50, paint);
             canvas.drawText("A", 50, 51, paint);
             canvas.drawText("M", 50, 52, paint);
      

      注意:那你可能会认为mPaint.setTextAlign(Align.CENTER)是左边还是左边。例如,如果您已经完成100并且从20px开始写入50px意味着它会尝试保持在20到50像素的中心。不在中心以获得100px。

    3. 如何让我的文字填满整个位图空间?

    4. 你在这里找不到任何包装内容,因为在Canvas中我们必须自己。

      所以首先要检查你有多少空间并填充给定的x和y值,并且还要预先改变文本大小。

答案 2 :(得分:0)

你好为什么你不能在TextView上使用自定义字体:我认为你可以只是将TextView子类化并添加三个默认的文本视图构造函数

  if (!isInEditMode()) {
              Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/ds_digib.ttf");
              setTypeface(tf);
    }

使文字垂直和水平设置

请参阅此link

enter image description here

希望这可以帮助您解决问题