Italian Domanda sciocca: Come caricare più main?

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Io. per il mio gioco del Video Poker, sto utilizzando le percentuali e, come dice LucaMS, alla fine ti gira la testa e ti impappini :rolleyes:
Ad esempio, per le carte, volevo utilizzare l' Addview anzicché metterle a manina, in modo da poter utilizare i Tag per intercettarle meglio e fare un lavoro più pulito (anche perché, penso, di mettere 50 giochini extra, con queste, oltre al gioco stesso :eek:)
Però, non so regolarmi con le dimensioni.
Cioè, ho creato un Panel e, al suo interno, metto le carte:

B4X:
For i=0 To 4
     imgCard.Initialize("imgCard")
     imgCard.Tag=i
     imgCard.Bitmap=LoadBitmap(File.DirAssets,"retro_red.jpg")
     pnlCard.AddView(imgCard,5%x+(8%x*i),5%y,20%x,40%y)
  Next

ed ecco cosa accade:

1) Se lo carico su un 7" lo spazio fra queste è esatto ma, se lo carico su un 4.5, queste vengono attaccane la una all'altra;
2) Se modifica la percentuale Width (20%x) e la percentuale Heigth (40%y), anziché ingrandirsi, si spostano.

:confused:

PS: Grazie Filippo per l'esempio, effettivamente gli script sono migliori (ora dovrò vedere se metterli in questo progetto o se farlo in altri ;))
Il tuo, LucaMs, se eseguito sull'emulatore 7", arriva a metà e non a tutto schermo.:oops:
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Mah! ora sembra andare (dopo riavvio del PC)... che strano :confused:
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Chiedo scusa ma,all'interno degli script,è possibile lavorare su oggetti creati con l'AddView? Se si, come faccio a richiamarli? Ricordate che sto parlando di immagini.
Ho notato che, al suo interno, non accetta molte proprietà (fra cui, appunto la Tag) :confused:
Quindi, se possibile, nel mio caso, imgCard, come faccio a settarne la grandezza per i vari Tag dallo Script?
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
E, quindi, mi tocca ingrandirli da codice :(
Erel ha messo una nuova versione la 3.8 Beta... ma la .6 e .7 che fine hanno fatto? :D
 

LucaMs

Expert
Licensed User
Longtime User
Con Scale.ScaleView(TuaView) li ingrandisci senza problemi!

Lascia stare Erel, non sa contare :D

Solo per curiosità (perché con Scale risolvi tutto, secondo me!) ti allego il modulo che avevo sviluppato a Settembre (!), quindi potrebbe avere difetti, stavo iniziando.

Ha il grosso difetto che non può recuperare i nomi delle view, quindi bisogna inserirli nei tag (nel Designer)

Come ho scritto qualche post fà, ti genera il codice per la dichiarazione e posizionamento/dimensionamento delle view (adoro i generatori di codice :))
 

Attachments

  • lmGeneraPerc.zip
    9.7 KB · Views: 237

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ti posto il codice di prima:


B4X:
    For i=0 To 4
       
        imgCard.Initialize("imgCard")
        imgCard.Tag=i
        imgCard.Bitmap=LoadBitmap(File.DirAssets,"retro_red.jpg")
        pnlCard.AddView(imgCard,-1%x+(13%x*i),-5%y,20%x,40%y)
       
    Next

ImgCard è dichiarata come ImageView nel Global.

Ho provato ad inserire:
B4X:
Scale.ScaleView(imgCard)

Sia che lo metto all'interno del ciclo (dopo il FOR o primadel NEXT) o all'esterno di questo, la grandezza delle carte rimane invariata (sempre la stessa, ovvero, grande in un 4.5" e piccola in un 7"), mentre la spaziatura è aumentata mostruosamente :eek:.
In pratica è come se non ci fosse.
Se lo faccio sul pnlCard, quello che si ingrandisce oltre schermo è il pannello dove sono messe le carte.

Quest'oggi mi trovo in un posto molto chiassoso e non è giornata :p
 

LucaMs

Expert
Licensed User
Longtime User
Ecco, anch'io in questo momento ho chiasso intorno.
Ma hai dichiarato una variabile globale, ImgCard che reinizializzi 4 volte nel ciclo, invece tu devi avere 4 view diverse, quindi dichiarle all'interno del ciclo.

Generalizza, è semplice:
ciò che crei col Designer, lo carichi con LoadLayout: dopo il caricamento, utilizzi Scale.ScaleAll (Activity O PANNELLO)

se invece aggiungi altre view o PANNELLI da codice, utilizzando le percentuali otterrai... le percentuali, quindi non dovrai scalare "alcunché", se invece utilizzi i dip, userai Scale.View se è una view, Scale.ScaleAll se è un pannello (in quanto può contenere altre view e pannelli)
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Il fatto è che io, creo prima un pannello con il Designer, ma poi inserisco elementi a mano (in questo aso le carte).
Inserendo le percentuali (specialmente di Width ed Heigth), queste, non riescono a trasformarsi in base alla dimensione el dispositivo (sul 4.5 si vedono grandi,s sul 7" piccole).
Ora, seguento il semplice codice che ti ho dato, come posso far in modo che queste create da codice si ridimenionino in base al dispositivo?
Ho provato facendo riferimento alla dimensione del Panel in cui si trovano, ma non funziona. :(

PS: mi sono accorto che lo Scale non lo utilizzo.
 

LucaMs

Expert
Licensed User
Longtime User
Il fatto è che io, creo prima un pannello con il Designer, ma poi inserisco elementi a mano (in questo aso le carte).
Inserendo le percentuali (specialmente di Width ed Heigth), queste, non riescono a trasformarsi in base alla dimensione el dispositivo (sul 4.5 si vedono grandi,s sul 7" piccole).
Ora, seguento il semplice codice che ti ho dato, come posso far in modo che queste create da codice si ridimenionino in base al dispositivo?
Ho provato facendo riferimento alla dimensione del Panel in cui si trovano, ma non funziona. :(

PS: mi sono accorto che lo Scale non lo utilizzo.


T' ho pizzicato, sei toscano, non romano!
ma poi inserisco elementi a mano (in questo aso le carte).:D

Dopo farò una prova pratica ma intanto ti dico come DOVREBBE funzionare.
Come ti ho detto, se utilizzi il Designer (sia per una intera Activity che per un Panel) DOPO che lo hai caricato devi adattarlo utilizzando Scale.
Poi, ogni volta che aggiungi qualche altra view, se esprimi le sue dimensioni e posizione in dpi devi adattarla con Scale.ScaleView, se le esprimi con le percentuali non devi fare altro.

Mettiamo che io ho un variant standard, 320x480. Disegno un panel con dentro un paio di tasti. Lo carico con LoadLayout e poi:
Scale.Initialize (se non l'ho già inizializzato altrove)
Scale.ScaleAll(Panel1, True)

Private MyButton as Button
MeButton.Initialize("MyButton")

e qui, a pensarci bene, potresti fare in due modi, con i dpi:

Panel1.AddView(MyButton, 10dip, 10dip, 50dip, 100dip)
Scale.ScaleView(MyButton)

oppure
Panel1.AddView(MyButton, 10dip * Scale.ScaleX, 10dip * Scale.ScaleY, 50dip * Scale.ScaleX, 100dip * Scale.ScaleY)

con le percentuali:
PIFFERI: ma quando mi sveglio?
Non ti funziona perché utilizzi 10%x, che corrisponde al 10% dello Screen, non del Panel!

Dovresti usare Panel1.Width * (10/100), per avere il 10% (o direttamente * 0.1)
 

luciano deri

Active Member
Licensed User
Longtime User
Domanda vagamente pertinente con l'argomento:
Ho creato l'activity di intro, adesso e voglio farla apparire prima del Main. Come faccio a stabilire la nuova priorità? Grazie e Saluti.
 

LucaMs

Expert
Licensed User
Longtime User
Non so se funzioni, ma prova a modificare il file Manifest aggingendo:

B4X:
    <activity android:name=".LaunchingActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.[qui metti il nome della activity]" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Dopodiché...

mi dici se ha funzionato, hehehe
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
...e se richiami, allla partenza della Main, la tua Activity Intro, magari passandogli una variabile di controllo per il ritorno?
Certo, se la soluzione data da Luca funziona...meglio! :p
 
Last edited:

luciano deri

Active Member
Licensed User
Longtime User
Non so se funzioni, ma prova a modificare il file Manifest aggingendo:

B4X:
    <activity android:name=".LaunchingActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.[qui metti il nome della activity]" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Dopodiché...

mi dici se ha funzionato, hehehe
Ci avevo già provato ma continua a partire direttamente dalla main, come si fa a passare una variabile ad una Activity? Io mi sarei limitato a dichiarare delle variabili in Process_Globals ...
 

LucaMs

Expert
Licensed User
Longtime User
Ouch, io non ho letto (o forse già dimenticato, data la mia proverbiale memoria) tutto il thread, ho soltanto cercato la soluzione alla tua ultima domanda (cercato, eh!).

Adesso non sono ancora sveglio, quindi faccio altrettanto: rispondo solo all'ultima, diciamo "meccanicamente".

Oltre l'uso delle variabili a livello di processo (Global_Process) puoi usare delle routine, sia nelle Activity che nei Service Module, che richiami da un punto esterno (sempre Activity o servizi).

Cioè, se hai una Activity actSeconda ed in questa hai una routine MiaRoutine(MiaVariabile As Object), dal Main DEVI usare:

CallSubDelayed2(actSeconda, "MiaRoutine", MiaVariabileNelMain).

DEVI usare CallSubDelayed2 anziché CallSub2 perché finché la tua Main è attiva, non potrà essere attiva contemporaneamente anche la actSeconda; quindi quel Delayed significa "Ritardato" (un po' come me, erosmax, maxware e udg, insomma :D) e che MiaRoutine verrà effettivamente eseguita solo quando sarà completata la routine del Main nella quale tu fai la chiamata CallSubDelayed2.

Ammazza quanto spiego bbbene :D
 

luciano deri

Active Member
Licensed User
Longtime User
Quindi il ritorno dalla sub chiamata il programma passa sempre dall'activity_resum del main? E li posso testare la variabile di ritorno?
 

LucaMs

Expert
Licensed User
Longtime User
Non ci può essere una variabile di ritorno, perché, nell'esempio fatto, la Main chiama la MiaRoutine della actSeconda ma prosegue l'esecuzione del suo codice, fino al termine della sua routine, non aspetta un valore di ritorno.

La tua domanda era come passare una variabile ad un'altra activity.

Eventualmente, la MiaRoutine imposterà la sua "risposta" in una variabile globale oppure essa (che modo arcaico di parlare, hehehe) potrebbe chiamare a sua volta una routine della Main, sempre con CallSubDelayed.

Per esempio:

Nella Main:
B4X:
Private Sub Qualcosa
    CallSubDelayed2(actSeconda, "CalcolaIlDoppio", 5)
End Sub

Public Sub Risposta(Risultato As Double)
    Log(Risultato)
End Sub



Nella actSeconda:

B4X:
Public sub CalcolaIlDoppio(Valore As Double)
    Dim Risultato As Double = Valore * 2
    CallSubDelayed2(Main, "Risposta", Risultato)
End Sub
 

luciano deri

Active Member
Licensed User
Longtime User
Ho capito, grazie 100000. Mi mancava la call di ritorno dalla seconda activity (chiamato) con cui avvio la sub nell'activity main (chiamante) per gestire il valore esito.
 

udg

Expert
Licensed User
Longtime User
Ciao Luciano (e un saluto a tutti).
Ci sono un paio di post interessanti su come avviare l'app da un'activity diversa da Main.

Il primo fa riferimento a quanto già illustrato da LucaMs, ma aggiunge di rendere read-only il Manifest.
Il secondo sembra un vecchio trucco, che potrebbe avere delle ripercussioni nel resto del codice in funzione di cosa faccia; in pratica scambi il nome delle due activity.

UUHHHHHHH (il fantasma ritardato..)
ps: proprio oggi leggevo che il nuovo maschio italico sembri durare 2 minuti... essere "ritardato" non suona così male..eheh
 
Top