Мобильный телефон Flex 4.5 Изменить размер текстового поля с анимацией на событии активации программной клавиатуры?

Я использую Flex 4.5.1 с AIR 2.7 (и Flash Builder 4.5.1) для создания приложения для Blackberry Playbook.

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

Теперь я хочу изменить размер текстовой области, чтобы она соответствовала оставшейся части экрана, когда появляется клавиатура. Я знаю текущий размер и размер назначения и хочу использовать плавную анимацию, чтобы показать изменение размера текстовой области. (Я еще не могу установить высоту и вижу правильное изменение размера текстовой области в событии keyboard_activating, но я хочу сделать это с помощью анимации). Я пробовал использовать класс Animate, класс spark.effects.Move, но в данном случае ни один из них не работает. Анимация вроде запускается, но экран не обновляется!

Я не хочу использовать встроенное свойство resizeAppForKeyboard в приложении ViewNavigatorApplication. Я установил «нет» в дескрипторе приложения, так что с этой частью все в порядке.

Есть идеи/мысли? Мой подход вообще правильный? Как можно изменить размер текстовой области, используя анимацию в событии активации клавиатуры? Мой код выглядит так:

В главном представлении (событие onCreationComplete): (txNote — рассматриваемая текстовая область)

txNote.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, function(e:SoftKeyboardEvent):void {
    toggleEditMode(true);
});

txNote.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, function(e:SoftKeyboardEvent):void {
    toggleEditMode(false);
});

private function toggleEditMode(keyboardActivated:Boolean):void {
    trace("toggle edit: " + editMode + ", kb activating: " + keyboardActivated + ", txNote height = " + txNote.height);

    editMode = keyboardActivated;

    //we handle resize manually, because we want a nice animation happening and we want to resize only the text area - nothing else.
    var y:Number = editMode ? -38 : 0;
    var height:Number = editMode ? 218 : 455;
    txNote.moveAndSize(y, height);
}

Код в txNote.moveAndSize:

public function moveAndSize(newY:Number, newHeight:Number):void {

//parent group uses BasicLayout
//(this.parent as Group).autoLayout = false;
//resizePath.valueFrom = this.height;
//resizePath.valueTo = newHeight;

//movePath.valueFrom = this.y;
//movePath.valueTo = newY;

//resizeEffect.heightFrom = this.height;
//resizeEffect.heightTo = height;

    this.top = newY;
    moveEffect.xFrom = this.x;
    moveEffect.xTo = this.x;

    moveEffect.yFrom = this.y;
    moveEffect.yTo = newY;

    moveEffect.end();
    moveEffect.play([ this ]);

    //this.move(x, newY);
    //animate.play([ this ]);

    //this.height = height;
    //this.y = y;

    //setLayoutBoundsSize(width, height);
    //setLayoutBoundsPosition(x, y);
}

Различные эффекты moveEffect/movePath/animate, которые я пробовал, настраиваются в конструкторе txNote следующим образом:

public class NotesArea extends TextArea {
//      private var animate:Animate;
//      private var movePath:SimpleMotionPath;
//      private var resizePath:SimpleMotionPath;

        private var moveEffect:Move;
//      private var resizeEffect:Resize;

        public function NotesArea() {
            super();

//          animate = new Animate();
//          var paths:Vector.<MotionPath> = new Vector.<MotionPath>();
//          movePath = new SimpleMotionPath("top");
//          resizePath = new SimpleMotionPath("height");
//          paths.push(movePath);
            //paths.push(resizePath);

//          animate.duration = 300;
//          animate.motionPaths = paths;

//          animate.addEventListener(EffectEvent.EFFECT_UPDATE, function(e:EffectEvent):void {
//              trace("y = " + y);
//              invalidateDisplayList();
//          });
//          animate.addEventListener(EffectEvent.EFFECT_END, function(e:EffectEvent):void {
//              trace("EFFECT ended: y = " + y);
//          });

            moveEffect = new Move();
            moveEffect.duration = 250;
            moveEffect.repeatCount = 1;
            moveEffect.addEventListener(EffectEvent.EFFECT_END, function (e:EffectEvent):void {
                //(this.parent as Group).autoLayout = true;
                trace("move effect ran. y = " + y + ", top = " + top);
            });

            //this.setStyle("moveEffect", moveEffect);
//
//          resizeEffect = new Resize();
//          resizeEffect.duration = 250;
//          this.setStyle("resizeEffect", resizeEffect);
        }

}

person Krishna    schedule 01.07.2011    source источник


Ответы (1)


person    schedule
comment
Спасибо, я уже разобрался с этим, но поскольку вы опубликовали правильный ответ... :) - person Krishna; 07.08.2011