Гибкое мобильное оформление кнопок в ActionScript - многострочный ярлык Display

Я работаю над Flex mobilПриложение и оптимизировали его работу на мобильных устройствах. Я читал, что скины должны быть написаны на ActionScript поэтому я попытался создать свой AS ButtonSkin,

public class mButtonSkin extends ButtonSkin
{
    private static var colorMatrix:Matrix = new Matrix();

    protected var radiusX:Number = 12;
    protected var mAngle:Number = 30;
    protected var labelWidth:Number;
    protected var labelHeight:Number;
    protected var paddingLeft:Number = 12;
    protected var paddingRight:Number = 12;
    protected var paddingTop:Number = 2;
    protected var paddingBottom:Number = 2;



    public function mButtonSkin() {
        super();
    }


    override protected function drawBackground(unscaledWidth:Number,unscaledHeight:Number) : void {
        colorMatrix.createGradientBox(width,height,mAngle);
        if (currentState == "up") {
            graphics.beginGradientFill(GradientType.LINEAR, 
                [hostComponent.getStyle("fill3"),hostComponent.getStyle("fill1")], [1,1], [0,255], colorMatrix);
        } else {
            graphics.beginFill(hostComponent.getStyle("fill4"));
        }

        graphics.lineStyle(0.5,hostComponent.getStyle("borderColor"),0.5);
        graphics.drawRoundRect(0,0,hostComponent.width,hostComponent.height,12);
        graphics.endFill();
    }


    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number) : void {
        labelDisplay.wordWrap = true;
        labelDisplay.multiline = true;

        labelDisplay.commitStyles();

        labelWidth = width - paddingLeft - paddingRight;
        labelHeight = height - paddingTop - paddingBottom;

        var x:Number = width / 2 - labelWidth / 2;
        var y:Number = height / 2 - getElementPreferredHeight(labelDisplay) / 2;

        setElementSize(labelDisplay,labelWidth,labelHeight);
        setElementPosition(labelDisplay,x,y);
    }


    override protected function labelDisplay_valueCommitHandler(event:FlexEvent) : void {
        labelDisplayShadow.text = "";
    }
}

Применяя этот скин в моих кнопках:

Кнопка labelDisplay имеет неправильное выравнивание (вертикальное выравнивание должно быть посередине).

После нажатия на кнопку:

Мои кнопки labelDisplay теперь вертикально выровнен по середине.

Я что-то пропустил? Что я сделал не так?

1 ответ

Решение

На layoutContents функция, прежде чем позиционировать labelDisplay элемент, я проверил сначала, является ли это numLines свойство больше 1. вот моя обновленная функция:

    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number) : void {
        labelDisplay.wordWrap = true;
        labelDisplay.multiline = true;

        labelWidth = width - paddingLeft - paddingRight;
        labelHeight = height - paddingTop - paddingBottom;

        var x:Number = width * .5 - labelWidth * .5;
        var y:Number = height * .5 - getElementPreferredHeight(labelDisplay) * .5;

        setElementSize(labelDisplay,labelWidth,labelHeight);

        if (labelDisplay.numLines == 1)
            setElementPosition(labelDisplay,x,y);
        else
            setElementPosition(labelDisplay, x, labelDisplay.getLayoutBoundsY());
    }

это решение может быть бесполезным для других разработчиков, но оно решило мою проблему.

Другие вопросы по тегам