Flash AS3 - AddChild извън обхвата на спрайтовете

Опитвам се да създам динамичен превъртащ се списък във Flash AS3. Когато създавам списък, го задавам да бъде първоначална дължина. По-късно добавям още обекти към списъка, който е извън оригиналния размер на списъка. Искам да мога да превъртя списъка надолу и да видя всички обекти.

Лентата ми за превъртане просто премества y позицията на списъка. Въпреки това, всеки обект, който е изчертан извън оригиналния размер на списъка, не се показва, когато стартирам програмата и превъртя. Как мога да поправя това?

Имам обект списък, който има функцията по-долу, когато трябва да добавя съдържание към списъка. Когато инициализирам списъка, му давам начална височина и ширина, които използвам за създаване на маска.

public function AddPlayers(pPlayers:Array, pScrollBar:ScrollBar):void
{
        var player:Player;

        trace("happened again");
        for (var i:int = 0; i < pPlayers.length; i++)
        {               
            player = pPlayers[i];                               
            this.addChild(player);
            player.x = 0;
            player.y = player.height * i;
        }

        pScrollBar.InitializeScrollBar(this);       
}

Функцията InitializeScrollBar актуализира свойствата на лентата за превъртане въз основа на размера на добавеното съдържание. Променя основно размера на лицето за превъртане в зависимост от размера на съдържанието на списъка.

public function InitializeScrollBar(pList:List)
{
        this.list = pList;

        // Size and place scroll track
        scrollTrack.height = scrollHeight - 2 * scrollUp.height;
        scrollTrack.y = scrollUp.height;            
        addChild(scrollTrack);          

        // Place scroll face
        scrollFace.y = scrollUp.height;
        scrollFace.height = scrollTrack.height * (scrollHeight / list.height);          
        addChild(scrollFace);

        // Place scroll buttons
        addChild(scrollUp);
        scrollDown.y = scrollDown.height + scrollTrack.y + scrollTrack.height;
        addChild(scrollDown);
        scrollDown.scaleY = -1;


        scrollFace.addEventListener(MouseEvent.MOUSE_DOWN, MoveScrollFace);

        scrollDown.addEventListener(MouseEvent.CLICK, MoveDown)
        scrollUp.addEventListener(MouseEvent.CLICK, MoveUp)
}

Също така имам функция за актуализиране в лентата за превъртане, която използва събитие ENTER FRAME, когато лицето за превъртане се плъзга.

private function Update(evt:Event)
{
        trace(mouseY);
        scrollFace.y = mouseY;

        if (scrollFace.y <= scrollTrack.y)
        {
            scrollFace.y = scrollTrack.y;
        }
        else if (scrollFace.y + scrollFace.height >= scrollTrack.y + scrollTrack.height)
        {
            scrollFace.y = scrollTrack.y + scrollTrack.height - scrollFace.height;
        }

        var scrollChange:Number = (list.height - scrollHeight)/(scrollTrack.height - scrollFace.height);
        list.y = -1 * scrollChange * (scrollFace.y - scrollUp.height);          
        list.y = list.y + list.y % 25;

}   

person Sean    schedule 29.07.2011    source източник
comment
Имате ли код, който можете да споделите?   -  person Corey    schedule 29.07.2011
comment

Номерът е да имате два отделни записа във вашата защитна стена, един за вход във формуляра и един за вход във facebook. Но в моя случай имам един URL адрес за влизане, където потребителят може или да влезе, като използва своите идентификационни данни, или да щракне върху Facebook връзка, за да се удостовери чрез Facebook OAuth2 API, използвайки FOSFacebookBundle. Ето пример от моя security.yml конфигурационен файл, за да накарам това да работи:

security:
  factories:
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"

  providers:
    chain_provider:
      providers: [acme.form_provider, acme.facebook_provider]
    acme.form_provider:
      id: acme.user_provider.form
    acme.facebook_provider:
      id: acme.user_provider.facebook

  firewalls:
    dev:
      pattern:  ^/(_(profiler|wdt)|css|images|js)/
      security: false

    public:
      pattern:   ^/
      fos_facebook:
        app_url: "your_app_url"
        server_url: "your_server_url"
        login_path: /login
        check_path: /login_check/facebook
        provider: acme.facebook_provider
      form_login:
        login_path: /login
        check_path: /login_check/form
        provider: acme.form_provider
      anonymous: true
      logout:    true

  role_hierarchy:
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

И ето проба от моя routing.yml файл, който се използва за дефиниране на маршрути за сигурност, необходими, за да може това да работи:

    # This is defined to let the user log in. The controller for
    # route display the login form and a facebook connect button
_security_login:
    pattern:   /login
    defaults:  { _controller: AcmeAcmeBundle:Main:login }

# This is defined for the form login authentication, 
# no controller is associated with it
_security_check_form:
    pattern:   /login_check/form

# This is defined for facebook login authentication, 
# a controller is associated with it but does nothing
_security_check_facebook:
    pattern:   /login_check/facebook
            defaults:  { _controller: AcmeAcmeBundle:Main:loginCheckFacebook }

_security_logout:
    pattern:   /logout
    defaults:  { _controller: AcmeAcmeBundle:Main:logout }

Използвайки security.yml преди, механизмът за сигурност ще провери дали потребител е влязъл с помощта на формуляр преди потребител, влязъл с Facebook. Това е така, защото редът, в който доставчиците са дефинирани в chain_provider. При всяка заявка FOSFacebookBundle проверява дали има facebook oauth2 бисквитка, ако е така, се опитва да зареди вашия потребител. Ако не успее да намери бисквитката, процесът на удостоверяване ще опита друг доставчик, ако е дефиниран след доставчика на facebook.

Във вашия случай, когато потребителят се опита да отиде на защитен URL адрес (в access_control), страницата за вход във facebook се показва и той се удостоверява, след което се пренасочва към вашия сайт, бисквитката се намира и потребителят се удостоверява успешно от FOSFacebookBundle . За да задействате ръчно процеса на удостоверяване, поставете бутон за свързване с facebook на вашия сайт, след което в javascript пренасочва потребителя към друга страница от вашия сайт. По този начин бисквитката ще бъде зададена от бутона за свързване и FOSFacebookBundle ще го удостовери при следваща заявка. Това, което правя, е да пренасоча потребителя към пътя login_check за facebook в javascript, когато бутонът за свързване с facebook е бил успешен. По този начин механизмът за сигурност ще го пренасочи там, където е посочено в конфигурацията за сигурност.

Надявам се, че това ще ви помогне да постигнете това, което искате. Не се колебайте да задавате допълнителни въпроси, ако нещо не е ясно.

@Последващо действие #1

Наистина не можете да поставите fos_userbundle под възел public в конфигурацията на защитната стена, защото това не е валидна опция. Низът fos_userbundle се използва за препратка към FOSUserBundle клас UserProvider. Никога не съм използвал този пакет, но като чета документацията, трябва да използвате form_login. Можете да разгледате документацията на FOSUserBundle в Стъпка #5 и по-долу. Грешката, която споменавате, е странна, защото ви казва, че login_path не се обработва от защитната стена, но това е така, тъй като защитната стена съвпада с всичко, което започва с / (^/). Не съм сигурен какво се обърка, но вървите в правилната посока. Използвайте form_login и опитайте да проверите защо не работи от там.

Поздрави,
Мат

  -  person shanethehat    schedule 29.07.2011


Отговори (1)


Ако използвате стандартен UIScrollbar компонент, той има вградена функция scrollBar.update(); Трябва да използвате тази функция след промяна на размера на съдържанието.

person Bartek    schedule 29.07.2011
comment
Използвам обекти в моя списък, така че не мисля, че компонентът UIScrollBar ще работи. Мисля, че е само за текст. - person Sean; 29.07.2011