2013-10-27 5 views
2

У меня есть FocusPanel, что при нажатии на него добавляются новые Элементы/Виджеты, которые увеличивают его высоту. Обратите внимание, что нет явного изменения высоты в css FocusPanel, высота просто увеличивается в результате добавления новых элементов внутри панелиКак добиться плавного перехода высоты при добавлении новых элементов в панель в GWT?

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

Я попытался применить css transition: height 2s; к FocusPanel, а также ко всем другим элементам/виджетам, которые я добавляю к нему. Но, похоже, это не работает, переход вообще отсутствует. Я предполагаю, что это связано с тем, что высота не увеличивается из-за того, что я меняю свойство css, а просто добавляю больше элементов в контейнер.

Каков правильный способ добиться плавного перехода высоты при добавлении новых элементов в панель? Благодаря!

PS. Хорошим примером того, что я хотел бы достичь, является способ, которым twitter обрабатывает переход высоты панели, когда вы нажимаете на twit.

+0

Может это поможет вам http://blog-demo.appspot.com/#animation –

+1

я боюсь, вы должны были бы проверочной высоту в программно приложении. Поэтому всякий раз, когда вы добавляете или удаляете элемент со своей панели, вы вычисляете новую высоту и изменяете изменение размера. Для достижения анимации вы можете использовать несколько фреймворков: GQuery, GWT Animation или HTML-переходы. – fascynacja

+0

и BTW вы можете проверить, как это работает. Просто откройте FireBug (или другой инструмент для веб-разработчиков) и посмотрите, что происходит с параметрами панели Twitter. Изменена ли высота? или у них есть другой трюк, чтобы сделать это? – fascynacja

ответ

2

CSS-анимация работает только в том случае, если вы задали высоту фиксированным значениям.

Способ создания собственной реализации панели и переопределения метода добавления, так как он заботится о вычислении высоты и настройке до и после времени анимации.

Как @fascynacja указывает в своем комментарии, я бы пошел с gwtquery, чтобы сделать это по разным причинам, но главное, что это небольшая библиотека, разработанная в gwt, которая позволяет вам делать много вещей с небольшим количеством кода линий.

У вас есть пример панели, которая делает то, что вы хотите, используя анимацию gquery.

import static com.google.gwt.query.client.GQuery.*; 
[...] 

// Create your own implementation of a panel 
public static class MyFlowPanel extends FlowPanel { 

    // The GQuery object for this panel 
    GQuery $this = $(this); 

    // Override the add method so as each time it is called, we run an animation 
    // You can do the same with the remove method. 
    @Override 
    public void add(Widget w) { 
    // Compute the actual height 
    int hInitial = $this.height(); 
    // Set height to auto before adding the new child. 
    $this.height("auto"); 
    // Add the new widget to panel 
    super.add(w); 
    // Compute the new height 
    int hFinal = $this.height(); 

    // Use Gquery to .animate the panel from the old to the new height 
    // You could replace this with css3 transitions 
    $this.height(hInitial) 
     .stop(true) 
     .animate("height: " + hFinal, 2000); 
    }; 
}; 

public void onModuleLoad() { 
    // Create your panel, and use it as usual in GWT 
    final FlowPanel myFlowPanel = new MyFlowPanel(); 
    RootPanel.get().add(myFlowPanel); 
    // Set some css properties to your panel. You could set these in your style-sheet. 
    $(myFlowPanel).css($$("border: 1px solid grey; border-radius: 8px; background: #F5FFFA; width: 500px; padding: 8px")); 

    // Add 10 labels to the panel in periodes of 1000 ms 
    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { 
    int c = 10; 
    public boolean execute() { 
     if (c-- > 0) { 
     myFlowPanel.add(new Label(c + " Lorem ipsum dolor sit amet, consectetur adipiscing elit.")); 
     return true; 
     } 
     return false; 
    } 
    }, 1000); 
} 
+0

спасибо tocayo. Я понимаю основы вашего объяснения. Переопределение метода добавления выглядит как опрятное решение для меня. Я попробую это позже в течение недели. Я также рассмотрю использование GQuery. Кстати, разве вы не думаете, что менее эффективно использовать процессор для анимации GWT/GQuery, чем переходы CSS? – manubot

+0

уверен, что он менее эффективен, но зависит от того, где находится ваша горло. Если вы хотите что-то оживить, когда обрабатываете данные, не делайте этого, потому что анимация не будет текучей. Но обычно делать что-то вроде твиттера, не имеет значения. –

+0

понимается, спасибо. Еще один комментарий к вашему предложению об использовании gquery. Если правильно поняли, gquery предоставляет два основных преимущества - помимо встроенных fancy effects -: 1) меньше строк кода, чем при использовании простого GWT. 2) Мне не нужно содержать экземпляры моих виджетов для доступа к ним. Это, я полагаю, уменьшает объем памяти клиента? (хотя я понятия не имею, как GWT переводит экземпляры в JS ... возможно, он использует свою собственную селекторную серию CSS?). Я что-то пропустил? – manubot