Italian Come creare animazione clv simile a questo video?

Xfood

Expert
Licensed User
Salve a tutti,
Stavo giocando con un giochino scaricato dal play store, e sono rimasto affascinato da questa animazione, come possiamo creare con una clv / xclv un'animazione simile? Qualche idea / esempio..

P.s. togliere il .txt, altrimenti non me lo faceva allegare, e' un mp4 video
 

Attachments

  • VID-20250730-WA0022.mp4.txt
    298.1 KB · Views: 57

Xfood

Expert
Licensed User
Ho fatto una sorta di eleminacode, mi piacerebbe implementare questa animazione, per far scorrere la coda chiamata, attualmente lo fa senza animazione :-( ma se troppo complessa , pazienza, la lascio senza animazione.
 

Xfood

Expert
Licensed User
Gemini mi ha appena dato un po di codice, domani lo provo sul pc, adesso sono sul divano con lo smartphone
 

Xfood

Expert
Licensed User
Questa e' la risposta di gemini che proverò domani, se qualcuno e' curioso di provare, la allego qui.

GEMINI SCRIVE:
Passaggi per Implementare l'Animazione con XCLV:
1. Definire il Layout di una Singola Voce (Custom Layout):

Crea un file di layout (es. RankingItem.bal) che rappresenterà una singola riga della classifica. Questo file conterrà i controlli per:
  • Posizione: Label (o B4XView generico)
  • Nome Giocatore: Label
  • Punteggio: Label
  • Icona Stella: ImageView o Label con un carattere icona (es. Font Awesome).
Puoi raggruppare questi controlli all'interno di un B4XView principale (es. un Panel) per la singola riga.
2. Struttura Dati per il Giocatore:
Definisci un Type personalizzato per rappresentare i dati di ogni giocatore:
Snippet di codice

Type PlayerData (Position As Int, Name As String, Score As Int, HasStar As Boolean)

3. Inizializzare la XCLV:
Nel tuo Activity_Create o B4XPage_Created:
Snippet di codice

Private xclv As XCLV
Private players As List ' Lista di PlayerData

Sub B4XPage_Created (Root As B4XView)
Root.LoadLayout("MainPage") ' O il layout della tua pagina

xclv.Initialize(Me, "XCLV")
' Aggiungi la XCLV alla tua vista principale
Root.AddView(xclv.AsView, 0, 0, Root.Width, Root.Height)

' Carica i dati (esempio)
players.Initialize
For i = 1 To 100
Dim p As PlayerData
p.Position = i
p.Name = $"Player${i}"$
p.Score = Rnd(1, 100)
p.HasStar = (i Mod 5 = 0) ' Esempio: ogni 5° giocatore ha una stella
players.Add(p)
Next

' Aggiungi le voci iniziali alla XCLV
AddInitialItemsToXCLV()

' Avvia il timer per lo scorrimento
timerScroll.Initialize("TimerScroll", 50) ' Ogni 50ms per scorrimento fluido
timerScroll.Enabled = True
End Sub

Sub AddInitialItemsToXCLV()
For Each p As PlayerData In players
Dim pnl As B4XView = xui.CreatePanel("") ' O xui.CreatePanel("").LoadLayout("RankingItem", pnl)
pnl.LoadLayout("RankingItem", pnl) ' Carica il layout della riga

' Popola i controlli nel layout
pnl.GetView("lblPosition").Text = p.Position
pnl.GetView("lblName").Text = p.Name
pnl.GetView("lblScore").Text = p.Score
' Imposta la visibilità o l'immagine della stella
pnl.GetView("imgStar").Visible = p.HasStar ' Esempio

' Aggiungi l'item alla XCLV. L'altezza deve corrispondere all'altezza del layout di RankingItem.
xclv.Add(pnl, p) ' Il secondo parametro (p) è l'oggetto associato all'item
Next
End Sub

4. Implementare lo Scorrimento Animato e l'Evidenziazione:
Questo è il punto più delicato per replicare l'animazione esatta del video (scorrimento continuo e evidenziazione di una riga specifica). La XCLV non ha un metodo di scorrimento automatico continuo, ma puoi simularlo in diversi modi:
Metodo A: Manipolazione diretta dello ScrollView sottostante (Più simile al video):
La XCLV è essenzialmente un ScrollView con gestione ottimizzata degli elementi. Puoi accedere al suo ScrollView interno e manipolarne la posizione.
Snippet di codice

Private timerScroll As Timer
Private scrollSpeed As Int = 2 ' Pixel per tick
Private highlightedItemIndex As Int = -1 ' Indice della riga attualmente evidenziata
Private highlightDurationTicks As Int = 100 ' Quanti tick mantenere la riga evidenziata
Private highlightCounter As Int = 0

Sub TimerScroll_Tick
Dim sv As ScrollView = xclv.sv
sv.ScrollPosition = sv.ScrollPosition + scrollSpeed

' Logica per lo scorrimento "infinito" (se desiderato)
' Se lo ScrollPosition supera una certa soglia, puoi "teletrasportarlo" indietro
' e riposizionare gli elementi (più complesso da implementare perfettamente in questo modo).

' --- Logica di Evidenziazione ---
' Identifica quale elemento è al centro o nella posizione desiderata per l'evidenziazione
Dim centerY As Int = sv.ScrollPosition + sv.Height / 2
Dim itemFound As Boolean = False

For i = 0 To xclv.Size - 1
Dim itemTop As Int = xclv.GetItemOffset(i)
Dim itemBottom As Int = itemTop + xclv.GetItemHeight(i)

If centerY >= itemTop And centerY < itemBottom Then
' Questo è l'elemento "centrale"
If i <> highlightedItemIndex Then
' Nuovo elemento da evidenziare
If highlightedItemIndex <> -1 Then
' Rimuovi evidenziazione dal vecchio elemento
Dim oldPanel As B4XView = xclv.Get (highlightedItemIndex).Panel ' Attenzione: GetPanel potrebbe non essere pubblico o diretto, potresti dover accedere al controllo via B4XItem's Panel.
' Potresti dover usare xclv.GetItem(highlightedItemIndex).Panel.GetView("PanelRoot") se il tuo layout ha un panel radice.
If oldPanel.IsInitialized Then oldPanel.Color = Colors.Transparent
End If

Dim newPanel As B4XView = xclv.GetItem(i).Panel
If newPanel.IsInitialized Then
newPanel.Color = xui.Color_RGB(255, 255, 150) ' Colore giallo chiaro per evidenziare
highlightedItemIndex = i
highlightCounter = 0

' Potresti anche applicare una piccola animazione di zoom o opacità qui
' newPanel.SetLayoutAnimated(200, newPanel.Left, newPanel.Top, newPanel.Width * 1.05, newPanel.Height * 1.05) ' Esempio
End If
End If
itemFound = True
Exit
End If
Next

If Not itemFound And highlightedItemIndex <> -1 Then
' Nessun elemento corrente al centro, rimuovi evidenziazione se c'era
Dim oldPanel As B4XView = xclv.GetItem(highlightedItemIndex).Panel
If oldPanel.IsInitialized Then oldPanel.Color = Colors.Transparent
highlightedItemIndex = -1
End If

' Gestione della durata dell'evidenziazione se vuoi che cambi dopo un po'
' If highlightedItemIndex <> -1 Then
' highlightCounter = highlightCounter + 1
' If highlightCounter >= highlightDurationTicks Then
' ' Rimuovi evidenziazione e passa al prossimo (se vuoi scorrimento step-by-step)
' Dim oldPanel As B4XView = xclv.GetItem(highlightedItemIndex).Panel
' If oldPanel.IsInitialized Then oldPanel.Color = Colors.Transparent
' highlightedItemIndex = -1 ' Reset
' End If
' End If

' Nota: Per un effetto di scorrimento infinito, dovresti implementare una logica
' per aggiungere nuovi elementi in fondo e rimuovere quelli in cima una volta
' che sono fuori dallo schermo, mantenendo sempre un certo numero di elementi visibili.
' Questo è più avanzato e richiede di gestire l'aggiornamento dell'indice degli item.
End Sub

Metodo B: Scorrimento a Passi (Evidenziando un Item alla volta):
Se l'animazione non deve essere uno scorrimento continuo ma un "salto" da una riga all'altra evidenziandola per un breve periodo, la XCLV ha metodi migliori:
Snippet di codice

' ... (Dichiarazioni come sopra)
Private currentIndexToHighlight As Int = 0

Sub TimerScroll_Tick
' Scorri al prossimo elemento e evidenzialo
If currentIndexToHighlight < xclv.Size Then
' Scorri all'elemento
xclv.ScrollToItem(currentIndexToHighlight)

' Evidenzia l'elemento corrente (potrebbe richiedere un piccolo ritardo per l'animazione di scorrimento)
Dim pnl As B4XView = xclv.GetItem(currentIndexToHighlight).Panel
If pnl.IsInitialized Then
pnl.Color = xui.Color_RGB(255, 255, 150) ' Colore giallo chiaro

' Animazione per la riga evidenziata (opzionale)
pnl.SetLayoutAnimated(200, pnl.Left, pnl.Top, pnl.Width, pnl.Height) ' Reset o piccola animazione
End If

' Rimuovi evidenziazione dal precedente (se esiste)
If currentIndexToHighlight > 0 Then
Dim prevPnl As B4XView = xclv.GetItem(currentIndexToHighlight - 1).Panel
If prevPnl.IsInitialized Then prevPnl.Color = Colors.Transparent
End If

currentIndexToHighlight = currentIndexToHighlight + 1
Else
' Raggiunto la fine, ricomincia o ferma
Dim lastPnl As B4XView = xclv.GetItem(xclv.Size - 1).Panel
If lastPnl.IsInitialized Then lastPnl.Color = Colors.Transparent
currentIndexToHighlight = 0 ' Ricomincia
End If
End Sub

Considerazioni importanti per l'evidenziazione:
  • Accesso al Panel dell'Item: Quando la XCLV ricicla le viste, l'oggetto Panel di un XCLVItem potrebbe non essere sempre lo stesso riferimento o potrebbe non essere immediatamente disponibile se l'item non è visibile. È cruciale gestire questo.
  • Performance: Assicurati che le tue animazioni e la logica di scorrimento non sovraccarichino la UI. Regola la velocità del timer e la complessità delle animazioni.
  • Scorrimento Infinito: Per un vero scorrimento infinito come nel video, dovrai implementare una logica più sofisticata che aggiunge dinamicamente nuovi elementi in fondo alla XCLV (o sposta elementi esistenti in fondo) man mano che lo scorrimento procede, e rimuove quelli in cima quando non sono più visibili. Questo mantiene il numero di elementi nel ListView gestibile.
L'uso di XCLV è sicuramente il modo più professionale e performante per realizzare questo tipo di interfaccia in B4X. Ti consiglio vivamente di consultare gli esempi e la documentazione di XCLV nei forum di B4X, in quanto ci sono molte risorse utili per la gestione di liste complesse e animazioni.






Deep Research
 

LucaMs

Expert
Licensed User
Longtime User
Si può ma come minimo servirebbe un'oretta (al solito, si prevedere un certo tempo e poi se ne spende il doppio);
Gemini mi ha appena dato un po di codice, domani lo provo sul pc, adesso sono sul divano con lo smartphone
Gemini mi ha appena dato un po di codice, domani lo provo sul pc, adesso sono sul divano con lo smartphone
Eh già, un'ora nostra è un millesimo di secondo delle IA 😲 :(

Poi dovrai correggere o migliorare parti di codice.

Qui il punto importante è: otterrà la stessa animazione? Mah, ne dubito.
 

Xfood

Expert
Licensed User
purtroppo non riesco a ricreare un'animazione simile
l'unica che si avvicina e' questa: https://www.b4x.com/android/forum/t...rag-to-reorder-items-animation-effect.149447/
ma dovrebbe essere in automatico, tipo avere una
funzione sposta(5,7)
per spostare l'item 5 nella posizione 7
anche se questa animazione non e' il massimo, ma sempre meglio di niente.
qualcuno riesce ad integrare questa funzione in questo progetto?

CLVDragger_Move.gif
 

Star-Dust

Expert
Licensed User
Longtime User
Si può fare, non è complicato.
XUIview2 ha un animazione simile (ma non uguale) per spostare i nuovi item inseriti in xListView. Il concetto comunque è similare.
Devi ricostruire la listView, un pò di tempo e olio di gomito (o chatGPT) e ci riuesci
 

Xfood

Expert
Licensed User
Erel wrote this code snippet 5 years ago... example search for it in the forum... tweak it a little bit to your needs... and no it's not a CLV.
Sometimes it helps to read some tutorials...
Surely you have seen this tutorial CLV examples ...
Thank you, man, I try your example, and I see if I can adapt it to my needs
 
Top