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

3

我的期望输出:

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

我的问题:

  • 无法在小部件中使用TextView的自定义字体(由于TextView在小部件中不是直接可访问的,因此我们必须使用remoteviews来使用它们。)

因此,我想使用ImageView,在位图上绘制文本,然后将此位图设置为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);

以下是输出结果。 在此输入图片描述

3个回答

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)
谢谢,

你知道如何设置不同的值,例如RemoteView.setBundle()吗?也许我们可以使用这些函数之一来设置字体..???? - Farhan

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

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

    如果您想在画布中使用相同的字体,则将面孔设置为您正在使用的绘图对象。

  2. 如何使我的文本垂直和水平居中?

  3. 在画布中,当您通过paint obj绘制文本时。然后您可以设置paint obj

    mPaint.setTextAlign(Align.CENTER);
    

或者你可以放置在左边或右边。你不能设置垂直或水平,因为你正在绘制文本,所以你可以按照你想要的方式垂直或水平绘制。

例如,你需要绘制文本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像素,并且你从20像素到50像素开始写入文本,则它会尝试将文本保持在20到50像素的中心位置,而不是保持在100像素的中心位置。

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

在Canvas中,我们必须自己处理内容,因此您不会在这里找到任何包装内容。

因此,首先检查您有多少空间,并填写给定的x和y值,还要按比例更改文本大小。


首先,我们无法直接访问textview,因此无法像您说的那样设置字体。其次,canvas.drawText(...)需要“x”和“y”。如何提供这样的值,使文本在父容器中水平和垂直居中...第三,填充空间,您能否给出一些提示要检查哪些函数? - Farhan

0

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

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

要使您的文本垂直和水平设置

请查看此链接

enter image description here

希望这能帮助你解决问题。

不,对于小部件,你需要使用RemoteViews中的TextView,不能直接访问它...是的,我可以子类化TextView,但它将不支持运行时更改字体..比如如果我有一个选择不同字体的选项,那么这将成为你的问题。明白了吗? - Farhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接