3

アプリにカスタムLabelFieldを実装しています。小さいフォントでも問題なく動作します。フォントサイズを大きくすると、正しく表示されません。こちらがこの画像でご覧いただけます。

ここに画像の説明を入力してください

画像では、テキストの半分だけが表示されていることがわかります。どうすればこれを克服できますか。

ここでは、カスタム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 に答える