Ciao, cercavo di fare un'animazione per muovere un panel
Panel1.Location.X = 300 restituisce l'errore che è una proprietà in sola lettura e che non si può, quindi, assegnarle un valore
qualche consiglio?
Ciao, cercavo di fare un'animazione per muovere un panel
Panel1.Location.X = 300 restituisce l'errore che è una proprietà in sola lettura e che non si può, quindi, assegnarle un valore
qualche consiglio?
O
ocodice:Panel1.Left = 300
. La prima dovrebbe essere un pelo più efficiente.codice:Panel1.Location = New Point(300, Panel1.Location.Y)
Amaro C++, il gusto pieno dell'undefined behavior.
Funzionano entrambe alla grande, grazie 1000!![]()
Scusa ma...
...il fatto che abbia messo una pausa nel ciclo e che non abbia ottenuto l'effetto sperato di un'animazione è normale, vero?codice:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer = 0 For i = 1 To 300 Panel1.Left = i System.Threading.Thread.Sleep(10) Next End Sub
Si deve usare un timer in questi casi?
Scusa le domande basilari, fino a ieri lavoravo solo per il web e prima di ajax non avevo mai usato neppure il Thread.Sleep![]()
O prima della sleep inserisci un Application.DoEvents() o un Panel1.Refresh() (meglio) o usi un timer. In ogni caso non credo che otterrai un'animazione molto fluida.
Amaro C++, il gusto pieno dell'undefined behavior.
Ciao,
ho provato sia con DoEvents() che con Refresh() ma non vedevo l'animazione.
L'effetto che faceva era di fare le pause tutte insieme e, solo alla loro fine, spostava il panel con un 'colpo secco'.
Col timer è andata un pelino meglio ma, purtroppo, come avevi prognosticato, l'animazione risultante non era delle più fluide.
Tuttavia, aggiungendo un piccolo effetto di easing (la simulazione dell'inerzia) e sperimentando con la durata dell'intervallo del timer (ora a 35) , sono riuscito ad ottenere un risultato meno osceno del previsto e che, in alcuni casi, potrebbe anche far comodo :
I sorgenti del mini-progetto: easingPanelcodice:Public Class easingPanel Public direction As String = "sinistra" Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If direction = "destra" Then Dim targetX As Integer = 500 Dim distX As Integer = targetX - Panel1.Location.X If Panel1.Location.X <= targetX - 2 Then Dim movex As Integer = distX / 2 Panel1.Left += movex Else Panel1.Left = 500 Timer1.Enabled = False direction = "sinistra" End If Else Dim targetX As Integer = 10 Dim distX As Integer = targetX - Panel1.Location.X If Panel1.Location.X >= targetX + 2 Then Dim movex As Integer = distX / 2 Panel1.Left += movex Else Panel1.Left = 10 Timer1.Enabled = False direction = "destra" End If End If lblX.Text = Panel1.Location.X End Sub Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click Timer1.Enabled = True End Sub End Class
Ti ringrazio tantissimo per l'aiuto!
Se ti viene in mente come migliorare l'effetto fatti vivo!![]()
Sulla mia macchina l'animazione è molto fluida, complimenti, la simulazione di "frenata" tra l'altro è molto gradevole. Bisogna però vedere l'effetto su macchine meno recenti...
Tra parentesi, invece di usare una variabile stringa per memorizzare la direzione ti basta usare una variabile booleana.
codice:Public Class easingPanel Public moveToRight As Boolean = True Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If moveToRight Then Dim targetX As Integer = 500 Dim distX As Integer = targetX - Panel1.Location.X If Panel1.Location.X <= targetX - 2 Then Dim movex As Integer = distX / 2 Panel1.Left += movex Else Panel1.Left = 500 Timer1.Enabled = False moveToRight = False End If Else Dim targetX As Integer = 10 Dim distX As Integer = targetX - Panel1.Location.X If Panel1.Location.X >= targetX + 2 Then Dim movex As Integer = distX / 2 Panel1.Left += movex Else Panel1.Left = 10 Timer1.Enabled = False moveToRight = True End If End If lblX.Text = Panel1.Location.X End Sub Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click Timer1.Enabled = True End Sub End Class
Amaro C++, il gusto pieno dell'undefined behavior.
Grazie ancora dei consigli, ora ci faccio un po' di esperimenti anche se son sicuro che non sia una tecnica più di tanto produttiva ...altrimenti, a quest'ora, sarebbe diffusa al punto che l'avrei trovata googlelando.
A naso le prestazioni su una macchina lenta crollerebbero.
Io, intanto, ci metto la boolean che mi hai consigliato, poi ...chissà che non provi a farci un'interfaccia pazza per qualcuno dei miei basilarissimi tool![]()
Ho sistemato i sorgenti del mini-progetto con la variabile boolean e ho aggiunto un paio d'istruzioni che, se scommentate, fanno star fermo il panel e muovere la form.
L'inutility è scaricabile quì.