Гибкое мобильное оформление кнопок в 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());
}
это решение может быть бесполезным для других разработчиков, но оно решило мою проблему.