Позиционирование всплывающей подсказки в приложении изменяемого размера - PullRequest
3 голосов
/ 19 декабря 2008

Наше приложение Flex автоматически изменяет размеры в окне браузера, мы довольно легко решили целый ряд проблем с масштабированием, но остаётся всплывающая подсказка. Они отображаются в неправильном месте на экране и не масштабируются должным образом в зависимости от размера окна. Поскольку всплывающие подсказки располагаются автоматически, как мы можем решить эту проблему?

Чтобы уточнить, я использую встроенные подсказки flex. И проблема не в том, что всплывающие подсказки не перемещаются, так как приложение изменяет размер при отображении. Дело в том, что если я изменю размер приложения, все подсказки теперь будут отображаться не в том месте, даже если все остальное автоматически обновляется правильно.

Ответы [ 4 ]

3 голосов
/ 31 декабря 2008

Не уверен, что вы нашли решение для этого, но есть более простой подход. Этот код подключается к событию showtip-show во время фазы захвата (до его отображения), чтобы масштабировать и позиционировать его соответствующим образом в соответствии с масштабом содержащего элемента - в «этом» случае, в документе parentApplication. Он также включает немного кода, который, в моем случае, помог предотвратить смещение всплывающих подсказок со сцены при масштабировании (поэтому вам могут понадобиться только первые несколько строк - t.scaleX и t.scaleY):

import mx.events.ToolTipEvent;

addEventListener(ToolTipEvent.TOOL_TIP_SHOW, handleToolTipShow, true, 0, true);

private function handleToolTipShow(event:ToolTipEvent):void
{
    if (event && event.toolTip)
    {
        var t:IToolTip = event.toolTip;

        // Scale the tip itself
        t.scaleX = this.scaleX;
        t.scaleY = this.scaleY;

        // Scale the offsets
        var xOffset:int = 10 * this.scaleX;
        var yOffset:int = 10 * this.scaleY;

        // Set the default positioning 
        t.x = parent.mouseX + xOffset;
        t.y = parent.mouseY + yOffset;

        // Set the adjusted height and width
        var th:Number = t.height * this.scaleX;
        var tw:Number = t.width * this.scaleY;

        var rightEdge:int = t.x + tw + xOffset;
        var playerRightEdge:int = parent.width;
        var bottomEdge:int = t.y + th + yOffset;
        var playerBottomEdge:int = parent.height;

        // Offscreen right
        if (rightEdge > playerRightEdge)
        {
            t.move(parent.mouseX - xOffset - tw, parent.mouseY + yOffset);
        }

        // Offscreen bottom
        if (bottomEdge > playerBottomEdge)
        {
            t.move(parent.mouseX + xOffset, parent.mouseY - yOffset - th);
        }
    }
}
0 голосов
/ 29 декабря 2009
0 голосов
/ 17 июня 2009

Попробуйте преобразовать координаты в глобальные, используя contentToGlobal ()

0 голосов
/ 20 декабря 2008

Я не думаю, что есть отличное решение этой проблемы, поскольку ToolTipManager не знает, когда currentTarget для ToolTip меняет местоположение на сцене. Исправление в значительной степени касается самого Flex Framework. Я собрал воедино что-то, что, кажется, работает, но для этого нужно установить патч Flex Framework.

  1. Скопируйте mx.managers.ToolTipManager.as в ваш проект в mx.managers пакете, который вы создаете.

  2. Добавьте этот метод в конец файла.

    public static function positionToolTip() : void {
        ToolTipManagerImpl(impl).positionTip();
    }
    
  3. Вызовите этот метод для события resize вашего приложения.

...