Italian [Risolto] SetLayoutAnimated zoom in , zoom out

Xfood

Expert
Licensed User
Salve Ragazzi, ho un panel in b4j che tengo come visible=false e quando mi serve lo imposto a visible=tue,

Vorrei quando mi serve con SetLayoutAnimated un'animazione tipo zoom-in, quando lo voglio visibile, e
zoom-out quando lo voglio nascondere,

Da un po che giro sul forum ma non riesco a trovare la quadra , qualche suggerimento?
Grazie a tutti e buone vacanze
 

LucaMs

Expert
Licensed User
Longtime User
Fanne uno Snapsthot (dichiaralo come B4XView), e fai l'animazione della B4XImageView alla quale passerai lo Snapshot, al termine della quale imposterai di nuovo la visibilità del Pane B4J.
Non fare caso alla (tanta) roba in più, è il mio progetto B4XPages di base, roba che ovviamente puoi (dovresti) eliminare, tutto il codice necessario è nella B4XMainPage.

(L'animazione del progetto è molto di più fluida, rispetto alla gif "registrata")

 

Attachments

  • PaneZoom.zip
    33.7 KB · Views: 65
Last edited:

TILogistic

Expert
Licensed User
Longtime User
Non funziona se inizi con il pannello non visibile.

Snapshop non funziona con il pannello non visibile
 

TILogistic

Expert
Licensed User
Longtime User
Una possibile soluzione è clonare la vista.
l'altro lo nasconde (Left -2), per renderlo visibile per scattare l'istantanea (SnapShop)

???
Saluti amico dal chile
 

TILogistic

Expert
Licensed User
Longtime User
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non ho provato e me ne viene in mente una strampalata.
Carica il pane in una B4XPage diversa, DA NON MOSTRARE, e fai là lo snapshot, dichiara una variabile pubblica di tipo B4XBitmap ed usala nella pagina in cui devi fare l'animazione.
Fatto così (progetto allegato).


[La soluzione di @TILogistic sarebbe più semplice, ma c'è questo problema in B4J, per cui non può funzionare]
 

Attachments

  • PaneZoom.zip
    12.5 KB · Views: 52

Xfood

Expert
Licensed User
Grazie @LucaMs ,@TILogistic
ho combinato i due consigli, e sono riuscito a farlo funzionare senza bisogno della pagina nascosta, ma semplicemente spostando
fuori l'area visibile il panel ,
allego il codice

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private Pane1 As B4XView
    Private Button1 As B4XView
    Private Label1 As B4XView
    Private xivSnapshot As B4XImageView
    
    Private mPaneLeft, mPaneTop, mPaneW, mPaneH As Int
    Private mDuration As Int = 400
End Sub

Public Sub Initialize
    B4XPages.GetManager.TransitionAnimationDuration = 0
End Sub

#Region B4XPage EVENTS

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("mainpage")
    B4XPages.SetTitle(Me, "Home")
    mPaneLeft = Pane1.Left
    mPaneTop = Pane1.Top
    mPaneW = Pane1.Width
    mPaneH = Pane1.Height

    'Sposta Pane1 nella pagina di appoggio.
    Pane1.Top=-500
    Pane1.Visible = True
    xivSnapshot.Bitmap = Pane1.Snapshot
    xivSnapshot.mBase.SetLayoutAnimated(mDuration, mPaneLeft + mPaneW / 2, mPaneTop + mPaneH / 2, 0, 0)
    Pane1.Visible = False
    Pane1.Top=mPaneTop
    
End Sub

Private Sub B4XPage_CloseRequest As ResumableSub
    Dim sf As Object = xui.Msgbox2Async("Do you really want to close?", "", "Yes", "", "No", Null)
    Wait For (sf) Msgbox_Result (Result As Int)
    If Result = xui.DialogResponse_Positive Then
        Return True
    End If
    Return False
End Sub

#End Region

#Region VIEWS' EVENTS

Private Sub Button1_Click
    If Pane1.Visible Then
        'hide it
        xivSnapshot.Bitmap = Pane1.Snapshot
        xivSnapshot.mBase.Visible = True
        Pane1.Visible = False
        xivSnapshot.mBase.SetLayoutAnimated(mDuration, mPaneLeft + mPaneW / 2, mPaneTop + mPaneH / 2, 0, 0)
    Else
        'show it
        xivSnapshot.mBase.Visible = True
        xivSnapshot.mBase.SetLayoutAnimated(mDuration, mPaneLeft, mPaneTop, mPaneW , mPaneH)
        Sleep(mDuration)
        Pane1.Visible = True
        xivSnapshot.mBase.Visible = False
    End If
End Sub

#End Region
 

LucaMs

Expert
Licensed User
Longtime User
Grazie @LucaMs ,@TILogistic
ho combinato i due consigli, e sono riuscito a farlo funzionare senza bisogno della pagina nascosta, ma semplicemente spostando
fuori l'area visibile il panel
Si vede che avevo fuso, perché era ciò che avevo provato, dopo il giusto suggerimento di @TILogistic.

Quello, spostare il pane fuori schermo, serve a poter effettuare lo snapshot pur non mostrando il pane all'utente, e va bene, ma devi anche poter ridurre a zero le dimensioni della B4XImageView. Lo fai con SetLayoutAnimated, correttamente, che è come avevo fatto, ma...
metti un log dopo questa istruzione, per conoscere la larghezza della B4XImageView, che con SetLayoutAnimated hai appena impostato su 0. Ti darà un valore diverso da zero, ovvero quello della larghezza originale. Se copi l'istruzione log all'inizio della Sub Button1_Click, "magicamente" il log sarà zero

Ah, noto soltanto adesso che hai lasciato mDuration come tempo dell'animazione SetLayoutAnimated iniziale, mentre io avevo messo zero, in quanto l'istruzione, in realtà, serve solo a centrare e ridimensionare la B4XImageView, non a mostrarne davvero l'animazione; che sia dovuto a questo? Boh.
 

LucaMs

Expert
Licensed User
Longtime User
Eh sì, non ha alcun senso, ma prova così, nota i log che l'animazione non avviene, compare immediatamente il pane1 a dimensioni massime.

B4X:
    Pane1.Top=-500
    Pane1.Visible = True
    xivSnapshot.Bitmap = Pane1.Snapshot

'Durata impostata a zero, in quanto non necessaria/utile.
xivSnapshot.mBase.SetLayoutAnimated(0, mPaneLeft + mPaneW / 2, mPaneTop + mPaneH / 2, 0, 0)

    Log(xivSnapshot.mBase.Width)  '<<< primo log

    Pane1.Visible = False
    Pane1.Top=mPaneTop

B4X:
Private Sub Button1_Click
    Log(xivSnapshot.mBase.Width) ' <<< secondo log

    If Pane1.Visible Then
        'hide it
        xivSnapshot.Bitmap = Pane1.Snapshot
        xivSnapshot.mBase.Visible = True
        Pane1.Visible = False
        xivSnapshot.mBase.SetLayoutAnimated(mDuration, mPaneLeft + mPaneW / 2, mPaneTop + mPaneH / 2, 0, 0)
    Else
        'show it
        xivSnapshot.mBase.Visible = True
        xivSnapshot.mBase.SetLayoutAnimated(mDuration, mPaneLeft, mPaneTop, mPaneW , mPaneH)
        Sleep(mDuration)
        Pane1.Visible = True
        xivSnapshot.mBase.Visible = False
    End If
End Sub

Se poi cambi quello zero, lo imposti ad esempio su 50, funziona.

Qualcosa non quadra.
 

Xfood

Expert
Licensed User
L'importante e che funziona.. ?
 

TILogistic

Expert
Licensed User
Longtime User
?
Preferisco applicare le formule leviganti "EasingFunctions".


maggiori informazioni vedere post 3

ex: EaseOutExpo, EaseOutBounce, EaseOutBack

 
Last edited:

Xfood

Expert
Licensed User
Grazie molto amico, potresti allegare l'esempio come nella gif.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…