3

我正在我的应用程序中实现自定义标签字段。它适用于小字体,当我增加字体大小时,它不会正确显示。在这里你可以在这张图片中看到它。

在此处输入图像描述

您可以在图像中看到它只显示了一半的文本。我该如何克服这一点。

在这里,我给出了自定义 LabelField 的代码。请告诉我我做错了什么。

public class CustomLabelField extends Field  
{  
    private String label;  
    private int fontSize;
    private int foregroundColor;  
    private int backgroundColor;  
    public CustomLabelField(String label, int fontSize, int foregroundColor,  
                     int backgroundColor,long style)  
    {  
        super(style);  
        this.label = label;  
        this.foregroundColor = foregroundColor;  
        this.backgroundColor = backgroundColor;  
        this.fontSize = fontSize;
    }  

   protected void layout(int width, int height) {  

       setExtent(width, getFont().getHeight());  


   }  

    protected void paint(Graphics graphics) {  

       graphics.setBackgroundColor(backgroundColor);  
       graphics.clear();  
       graphics.setFont(setMyFont());  
       graphics.setColor(foregroundColor);  
       graphics.drawText(label, 0, 0, (int)(getStyle()& DrawStyle.ELLIPSIS | DrawStyle.HALIGN_MASK),getWidth() - 6);  
   }  

   // Get font for the label field  
   public Font setMyFont()  
   {  
     try {  
         FontFamily alphaSansFamily = FontFamily.forName("BBAlpha Serif");  
         Font appFont = alphaSansFamily.getFont(Font.PLAIN, fontSize, Ui.UNITS_pt);  
         return appFont;  

    } catch (ClassNotFoundException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  
    return null;  
  }  

}
4

2 回答 2

3

在您的layout方法中,您将字段的高度设置为当前的默认字体高度。这意味着当您使用较大的字体进行绘制时,文本会被裁剪。要解决此问题,请将您的布局方法更改为:

protected void layout(int width, int height) {  

    int fieldHeight = Ui.convertSize(fontSize, Ui.UNITS_pt, Ui.UNITS_px);
    setExtent(width, fieldHeight);  
}  

这会将您所需的字体大小转换为像素,并使用它来设置您的字段高度。

于 2012-04-12T15:01:37.127 回答
3

CustomLabelField仅仅通过扩展来创建你的LabelField呢?然后布局、绘制文本的复杂性(对齐、换行、样式考虑等)和其他任务将由自己完成,LabelField如果您在构造函数中设置适当的样式位。

你可以Field通过调用来应用任何字体setFont(Font)。该字段本身将调整其大小和绘图。检查以下片段。


CustomLabelField 实现:

class CustomLabelField extends LabelField {
    private int foregroundColor;
    private int backgroundColor;

    public CustomLabelField(String label, int foregroundColor,
            int backgroundColor, long style) {
        super(label, style);
        this.foregroundColor = foregroundColor;
        this.backgroundColor = backgroundColor;
    }

    protected void paint(Graphics graphics) {
        graphics.setBackgroundColor(backgroundColor);
        graphics.clear();
        graphics.setColor(foregroundColor);
        super.paint(graphics);
    }
}


例子:

class MyScreen extends MainScreen {

    public Font getMyFont(int fontSize) {
        try {
            FontFamily alphaSansFamily = FontFamily.forName("BBAlpha Serif");
            return alphaSansFamily.getFont(Font.PLAIN, fontSize, Ui.UNITS_pt);
        } catch (Exception e) {
        }
        return null;
    }

    public MyScreen() {
        CustomLabelField clf = new CustomLabelField(
                    "Main",
                    Color.WHITE,
                    Color.BLACK,
                    LabelField.ELLIPSIS);

        // Font setup
        clf.setFont(getMyFont(20));

        add(clf);
    }
}
于 2012-04-12T15:44:37.770 回答