1

バックグラウンドボタンの色とオンフォーカスのテキストの色を変えたい どうすれば作れますか?

 class RoundedRectField extends Field {

    // Layout values
    private static final int CURVE_X = 12; // X-axis inset of curve
    private static final int CURVE_Y = 12; // Y-axis inset of curve
    private static final int MARGIN = 2; // Space within component boundary

    // Static colors
    private static final int TEXT_COLOR = 0xFFFFFF; // White
    private static final int BORDER_COLOR = 0xFF8000; // dark gray
    private static final int BACKGROUND_COLOR = 0xFFFFFF; // White
    private static final int TEXT_COLOR_selected = 0xFF6DB6; 
    private static final int BORDER_COLOR_selected = 0xFF8000;
    private static final int BACKGROUND_COLOR_selected = 0xCCCCCC; 
    boolean _focus = false;
    private static String text_button;
    // Point types array for rounded rectangle. Each point type
    // corresponds to one of the colors in the colors array. The
    // space marks the division between points on the top half of
    // the rectangle and those on the bottom.
    private static final byte[] PATH_POINT_TYPES = {
            Graphics.CURVEDPATH_END_POINT,
            Graphics.CURVEDPATH_QUADRATIC_BEZIER_CONTROL_POINT,
            Graphics.CURVEDPATH_END_POINT, Graphics.CURVEDPATH_END_POINT,
            Graphics.CURVEDPATH_QUADRATIC_BEZIER_CONTROL_POINT,
            Graphics.CURVEDPATH_END_POINT,

            Graphics.CURVEDPATH_END_POINT,
            Graphics.CURVEDPATH_QUADRATIC_BEZIER_CONTROL_POINT,
            Graphics.CURVEDPATH_END_POINT, Graphics.CURVEDPATH_END_POINT,
            Graphics.CURVEDPATH_QUADRATIC_BEZIER_CONTROL_POINT,
            Graphics.CURVEDPATH_END_POINT, };

    // Colors array for rounded rectangle gradient. Each color corresponds
    // to one of the points in the point types array. Top light, bottom black.
    private static final int[] PATH_GRADIENT = { 0xFF8000, 0xFF8000, 0xFF8000,
            0xFF8000, 0xFF8000, 0xFF8000,

            0xFC0500, 0xFC0500, 0xFC0500, 0xFC0500, 0xFC0500, 0xFC0500 };

    // Center our readonly field in the space we're given.
    public RoundedRectField(String text_button) {
        super(FIELD_HCENTER | FIELD_VCENTER | READONLY);
        this.text_button = text_button;
    }

    // This field in this demo has a fixed height.
    public int getPreferredHeight() {
        return 70;
    }

    // This field in this demo has a fixed width.
    public int getPreferredWidth() {
        return 240;
    }

    // When layout is requested, return our height and width.
    protected void layout(int width, int height) {
        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    // When painting is requested, do it ourselves.
    protected void paint(Graphics g) {
        // Clear this area to white background, fully opaque.

            g.clear();
            g.setGlobalAlpha(255);
            g.setBackgroundColor(BACKGROUND_COLOR);

            // Drawing within our margin.
            int width = getPreferredWidth() - (MARGIN * 2);
            int height = getPreferredHeight() - (MARGIN * 2);

            // Compute paths for the rounded rectangle. The 1st point (0) is on
            // the left
            // side, right where the curve in the top left corner starts. So the
            // top left
            // corner is point 1. These points correspond to our static arrays.
            int[] xPts = { 0, 0, CURVE_X, width - CURVE_X, width, width, width,
                    width, width - CURVE_X, CURVE_X, 0, 0 };
            int[] yPts = { CURVE_Y, 0, 0, 0, 0, CURVE_Y, height - CURVE_Y,
                    height, height, height, height, height - CURVE_Y };

            // Draw the gradient fill.
            g.drawShadedFilledPath(xPts, yPts, PATH_POINT_TYPES, PATH_GRADIENT,
                    null);

            // Draw a rounded rectangle for the outline.
            // I think that drawRoundRect looks better than drawPathOutline.
            g.setColor(BORDER_COLOR);
            g.drawRoundRect(0, 0, width, height, CURVE_X * 2, CURVE_Y * 2);

            // Place some text in the center.

            Font font = Font.getDefault().derive(Font.PLAIN, 9, Ui.UNITS_pt);
            int textWidth = font.getAdvance(text_button);
            int textHeight = font.getHeight();
            g.setColor(TEXT_COLOR);
            g.setFont(font);
            g.drawText(text_button, (width / 2) - (textWidth / 2) - MARGIN,
                    (height / 2) - (textHeight / 2) - MARGIN);

    }

    protected void onFocus(int direction) {
        _focus = true;
        Dialog.alert("dcd");
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {

        _focus = false;

        invalidate();

        super.onUnfocus();
    }

}
4

1 に答える 1

2

いくつかの方法があります。paint()一般的な方法の 1 つは、既にオーバーライドしているメソッドでカスタム フォーカス描画を提供することです。

あなたはこれを行うことができるはずです(_selectedフォーカスされた状態の色を宣言したと仮定しています):

if (isFocus()) {
    g.setBackgroundColor(BACKGROUND_COLOR_selected);
else {
    g.setBackgroundColor(BACKGROUND_COLOR);
}

...

if (isFocus()) {
    g.setColor(TEXT_COLOR_selected);
} else {
    g.setColor(TEXT_COLOR);
}

これらの行はpaint()、現在呼び出している場所と に入りg.setBackgroundColorますg.setColor(TEXT_COLOR)

次に、フォーカスの描画は で処理されるため、オーバーライドdrawFocus()して何もしませんpaint()

protected void drawFocus(Graphics graphics, boolean on) {
   // override superclass implementation and do nothing
}

Field最後に、フォーカスを受け取るためには、フォーカス可能にする必要があります。次のように行うことができます。

public RoundedRectField(String text_button) {
    super(FIELD_HCENTER | FIELD_VCENTER | FOCUSABLE);
    this.text_button = text_button;
}

フィールドを動的にフォーカス可能にする必要がある場合 (フォーカス可能な場合もあれば、フォーカス不可能な場合もあります)、次のメソッドを実装できます。

public boolean isFocusable() {

ただし、フィールドが常にフォーカス可能な場合、FOCUSABLEコンストラクターでフラグを使用すると機能します。これをテストしたところ、フォーカスによってテキストの色が変化することがわかりました (OS 5.0 9550 で)。

于 2012-07-16T09:27:46.303 に答える