Italian Bordi Visuale

xarcius

Member
Salve ragazzi, sto realizzando un piccolo giochino. Ho un problema riguardo al bordo destro e quello in basso. Praticamente , attraverso dei tasti faccio muovere un imageview. Riguardo al bordo sinistro e inferiore uso questi codici:
B4X:
If ImageView2.Left <= Panel1.Left Then
      sinistra=True'esce fuori
      Msgbox("sono fuori dallo schermo","fuori sx") 'ok
      ImageView2.Left= ImageView2.Left + 9
   Else
      sinistra=False
   End If

If ImageView2.Top <= Panel1.Top Then
   ImageView2.Top= ImageView2.Top + 10
   Msgbox("sono fuori dallo schermo","fuori top") 'ok
      su=True
   Else
      su=False
   End If

Riguardo al bordo destro e inferiore, pensavo che bastasse invertire il segno e mettere un >= ma purtroppo non va. Avete qualche suggerimento?Grazie :)
 

worm

Member
Licensed User
Longtime User
Potrebbe funzionare:

B4X:
If ImageView2.Left + ImageView2.width >= Panel1.width Then
        destra=True'esce fuori
        Msgbox("sono fuori dallo schermo","fuori dx") 'ok
        ImageView2.Left= ImageView2.Left + ImageView2.width - 9
Else
        destra=False
End If

If ImageView2.top + ImageView2.height >= Panel1.height Then
        ImageView2.Top = ImageView2.Top + ImageView2.height - 10
        Msgbox("sono fuori dallo schermo","fuori bottom") 'ok
        giu=True
Else
        giu=False
End If
 

xarcius

Member
Potrebbe funzionare:

B4X:
If ImageView2.Left + ImageView2.width >= Panel1.width Then
        destra=True'esce fuori
        Msgbox("sono fuori dallo schermo","fuori dx") 'ok
        ImageView2.Left= ImageView2.Left + ImageView2.width - 9
Else
        destra=False
End If

If ImageView2.top + ImageView2.height >= Panel1.height Then
        ImageView2.Top = ImageView2.Top + ImageView2.height - 10
        Msgbox("sono fuori dallo schermo","fuori bottom") 'ok
        giu=True
Else
        giu=False
End If

Worm ti ringrazio :sign0098:
c'erano solo 2 piccoli errore (penso che non l'hai testato)
Come hai scritto tu, dopo aver toccato il bordo l'immagine continuava ad andare fuori bordo, invece di tornare indietro. Ho risolto così:
B4X:
Msgbox("sono fuori dallo schermo","fuori dx") 'ok
        ImageView2.Left= ImageView2.Left - ImageView2.width 

....

ImageView2.Top = ImageView2.Top - ImageView2.height 
        Msgbox("sono fuori dallo schermo","fuori bottom") 'ok

Ringrazio anche arenaluigi che mi ha dato un ottimo input ma non ci sono arrivato alla conclusione :BangHead:

Scusa ma per quanto riguarda il bordo Left e Top, se il parent dell'ImageView2 è il Panel1, nella condizione Panel1.Left/.Top non dovrebbe essere a "0"? Tipo:

B4X:
If ImageView2.Left < 0 Then

If ImageView2.Top < 0 Then

come parent tengo scritto "Activity"

Riguardo a left e top come mostrato avevo risolto, erano bottom e right che non riuscivo a risolvere. Grazie a tutti :)
 

Dominex

Active Member
Licensed User
Longtime User
Scusa ma se il parent è l'Activity, perchè allora usa i riferimenti di Panel1. Sarebbe un doppio errore, non capisco.

Cerco di spiegarmi meglio. Se l'ImageView2 deve restare entro i margini del Panel1 allora il mio esempio di sopra per Left e Top è il codice che dovresti usare. Se invece IV2 deve restare entro i margini dell'Activity è tutto sbagliato perchè non devi usare i riferimenti di Panel1 ma dell'Activity.

Ti dico questo perchè potresti avere un errore che al momento non vedi durante l'esecuzione, ma che potrebbe darti problemi più avanti con l'evoluzione del codice.

Io ho dato un idea sul codice basandomi su come era stato strutturato quello postato, altrimenti io avrei fatto così:

B4X:
IV2.Left = Min(Max(IV2.Left,0),Panel1.Width-IV2.Width)
IV2.Top = Min(Max(IV2.Top,0),Panel1.Height-IV2.Height)
 
Last edited:

xarcius

Member
IV2 deve restare all'interno del panel e non ne deve uscire, sennò finire sui bottoni che danno il movimento. Quindi come parent dovrei modificarlo da activity a panel?
Con i 4 codici scritti in precedenza lo stesso non esce dal panel, quindi penso che vada bene
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Anche io non ci ho capito molto,
per cui chiederei di spiegare meglio se il parent dell'immagine è l'activity oppure il panel, perchè cambia tutto.

Sergio
 

Dominex

Active Member
Licensed User
Longtime User
IV2 deve restare all'interno del panel e non ne deve uscire, sennò finire sui bottoni che danno il movimento. Quindi come parent dovrei modificarlo da activity a panel?
Con i 4 codici scritti in precedenza lo stesso non esce dal panel, quindi penso che vada bene

Esatto, se IV2 deve stare nei confini del Panel1, allora deve essere Panel1 il parent dell'IV2. Ecco come deve essere il controllo:

B4X:
If IV2.Left < 0 then IV2.Left = 0 'fuori a sinistra
If IV2.Top < 0 then IV2.Top = 0 'fuori in alto
If IV2.Left > Panel1.Width-IV2.Width then IV2.left = Panel1.Width-IV2.Width 'fuori a destra
If IV2.Top > Panel1.Height-IV2.Height then IV2.Top = Panel1.Height-IV2.Height 'fuori sotto

Credo tu abbia capito cosa intendo.
 

xarcius

Member
Esatto, se IV2 deve stare nei confini del Panel1, allora deve essere Panel1 il parent dell'IV2. Ecco come deve essere il controllo:

B4X:
If IV2.Left < 0 then IV2.Left = 0 'fuori a sinistra
If IV2.Top < 0 then IV2.Top = 0 'fuori in alto
If IV2.Left > Panel1.Width-IV2.Width then IV2.left = Panel1.Width-IV2.Width 'fuori a destra
If IV2.Top > Panel1.Height-IV2.Height then IV2.Top = Panel1.Height-IV2.Height 'fuori sotto

Credo tu abbia capito cosa intendo.

ok dominex ti ringrazio per la dritta. Seguirò il tuo consiglio :sign0013:
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
B4X:
If IV2.Left < 0 then IV2.Left = 0 'fuori a sinistra
If IV2.Top < 0 then IV2.Top = 0 'fuori in alto
If IV2.Left > Panel1.Width-IV2.Width then IV2.left = Panel1.Width-IV2.Width 'fuori a destra
If IV2.Top > Panel1.Height-IV2.Height then IV2.Top = Panel1.Height-IV2.Height 'fuori sotto
Dominex condivido il tuo codice :)
Però perchè il codice di Worm non va bene ?
B4X:
If ImageView2.Left + ImageView2.width >= Panel1.width Then
        destra=True'esce fuori
        ImageView2.Left= ImageView2.Left + ImageView2.width
Else
        destra=False
End If
E' all'interno del panel, mi è sfuggito qualcosa ?
Grazie
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Dominex condivido il tuo codice :)
Però perchè il codice di Worm non va bene ?
B4X:
If ImageView2.Left + ImageView2.width >= Panel1.width Then
        destra=True'esce fuori
        ImageView2.Left= ImageView2.Left + ImageView2.width
Else
        destra=False
End If
E' all'interno del panel, mi è sfuggito qualcosa ?
Grazie

Secondo me è sbagliato, sarebbe meglio:
B4X:
If ImageView2.Left + ImageView2.width >= Panel1.width Then
        destra=True'esce fuori
        ImageView2.Left= Panel1.width - ImageView2.width
Else
        destra=False
End If

Quindi il codice migliore è senz'altro quello di Dominex

In ogni caso meglio se l'immagine ha come parent il panel

Sergio
 
Last edited:

Dominex

Active Member
Licensed User
Longtime User
@arenaluigi

I problemi sono due.

Il primo riguarda il codice del primo post relativo al controllo "sinistro" e "alto" che sono errati perché la condizione va provata con "0". Il codice per il controllo "destro" e "basso" va bene.

Il secondo è che il parent è meglio che sia il Panel1 anziché l'Activity dato che è con questo che si controllano le condizioni.
 
Top