【问题标题】:Draw using canvas on Home screen widget在主屏幕小部件上使用画布绘制
【发布时间】:2012-05-10 09:06:38
【问题描述】:

我想要的输出:

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

我的问题:

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

所以我想使用 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);

以下是输出。

【问题讨论】:

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


    【解决方案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()吗?也许我们可以使用这些函数中的任何一个来设置字体..????
    【解决方案2】:

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

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

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

    看到这个link

    希望这能帮助您解决问题

    【讨论】:

    • 不,在小部件中,您使用远程视图中的文本视图,您不能直接访问它...是的,我可以将文本视图子类化,但它不支持运行时更改字体.. 就像如果我可以选择不同的字体,那么这将是您的问题。明白了吗?
    【解决方案3】:
    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。然后你可以设置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”。如何给出这样的值,使文本在水平和垂直方向都位于父容器的中心...第三个填充空间,你能提示一下要检查哪些功能吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多