Autore Topic: colori dinamici  (Letto 771 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
colori dinamici
« il: 13 Febbraio 2012, 18:06:01 CET »
0
ho messo nel market una torcia (potete vederla nella sezione closed source di questo forum) e vorrei aggiungere una funzione che cambi dinamicamente e in modo random il colore dello schermo, magari facendo qualche gioco di colori..
ma non so da dove partire..in rete non ho trovato nulla, probabilmente perchè non so cosa cercare..mi sapete indirizzare verso qualche possibile soluzione?
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:colori dinamici
« Risposta #1 il: 14 Febbraio 2012, 12:22:46 CET »
+2
Ad occhio e croce dichiari 3 variabili (rosso verde e blu) poi lanci un thread che ogni n secondi li sceglie random.
Il problema è che se hai una torcia non vuoi che vengano estratti colori con luminosità bassa.

A questo punto ti consiglierei di utilizzare un altro spazio di colori come HSL (Hue Saturation LUMINANCE) mantenendo la luminosità alta (che so.. impostandola minimo a 0.5). Per la conversione tra spazi di colore differenti vedi:

http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript

Se vuoi fare le cose "in grande" puoi mettere un tempo di transizione durante il quale il tuo schermo cambia da un colore all'altro con una semplice interpolazione lineare. Occhio.. interpola linearmente i colori HSL non i colori RGB e ogni "frame" riconverti... questo perchè l'interpolazione lineare tra due colori rgb molto eterogenei è di solito orrenda a vedersi...

 :-)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:colori dinamici
« Risposta #2 il: 14 Febbraio 2012, 13:21:31 CET »
0
molto interessante la tua risposta, e mi ha gia fatto venire in testa qualcosa..ma essendo la prima volta che mi avventuro in queste cose, non riesco a capire come richiamare l'effetto transizione..hai un esempio da postarmi o il link alle api che gestiscono questa cosa?
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:colori dinamici
« Risposta #3 il: 14 Febbraio 2012, 13:52:47 CET »
0
Ho visto la tua app sul forum... utilizzi una surfaceview dentro ad un layout? Hai già un thread che gira?

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:colori dinamici
« Risposta #4 il: 14 Febbraio 2012, 13:57:43 CET »
0
quella che hai visto non utilizza surfaceview, solo backgroung del layout..
la nuova versione che sto preparando invece la utilizza, perchè avevo provato a inserire un cubo multicolore che ruota e ruotando cambia il colore..però mettendolo a dimensionipiccole, fa una luce molto bassa..invece mettendolo a dimensioni grandi fa un effetto bruttissimo da vedere :(
cmq al momento non esiste nessun thread.

edit: so provando alcuni effetti..per ora ho visto il fadein e fadeout, ma non è un gran che..mi piacerebbe di piu uno scorrimento laterale..
« Ultima modifica: 14 Febbraio 2012, 14:37:49 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:colori dinamici
« Risposta #5 il: 14 Febbraio 2012, 14:49:50 CET »
0
Non cambia molto comunque se hai una surfaceview potresti provare a implementare runnable.

In ogni caso il concetto è semplice.

crei una variabile per il timestamp iniziale, due variabili per tenere il tempo e 3 variabili per componente di colore (ti faccio l'esempio col rosso):
Codice (Java): [Seleziona]
// Ultimo timestamp per tenere conto del tempo passato
private float m_fColorTimestamp;
// Timer di transizione
protected float m_fTransitionTimer;
// Timer di cambio colore
protected float m_fColorChangeTimer;
// Rosso corrente
protected float m_fRedCur;
// Rosso origine
protected float m_fRedOld;
// Rosso destinazione
protected float m_fRedNew;

Poi crei un thread e nel thread ti prendi i millisecondi

Codice (Java): [Seleziona]
// Se è la prima esecuzione non fare niente...
if (m_fColorTimestamp != 0 ) {
 // Calcoli la differenza di tempo tra il vecchio frame e il nuovo frame
 float deltatime = timestamp-m_fColorTimestamp;

  // Aggiorni il timer di transizione
  m_fTransitionTimer+= deltatime;
  // Aggiorni il timer di cambio colore
  m_fColorChangeTimer+= deltatime;

// Se sono passati meno di 1000 millisecondi interpola...
if( m_fTransitionTimer < 1000 ) {
// Calcola l'interpolazione
float interpolator = m_fTransitionTimer / 1000.0f;
// Interpola linearmente... se interpolator è 0 hai il colore red old se è 1 hai il colore red new...
m_fRedCur = m_fRedOld + ((m_fRedNew-m_fRedOld)*interpolator);
}
else{
// Altrimenti il cambio colore è finito... setta il colore target
m_fRedCur = m_fRedNew;
}

// Se è il momento di cambiare colore (10 secondi)
if( m_fColorChangeTimer > 10000 ){
  // Resetta il timer di cambio colore
   m_fColorChangeTimer -= 10000;
// Resetta il timer di transizione colore
   m_fTransitionTimer = m_fColorChangeTimer;
// Setta il vecchio colore uguale al nuovo
m_fRedOld = m_fRedNew;
// Estrai casualmente a tuo piacere un nuovo colore...
m_fRedNew = numerocasualetra1e0();
// Aggiorna il colore corrente, forse non serve...  :-P
m_fRedCur = m_fRedOld;
}
}
else{
// Prima iterazione, forza il colore corrente a red old
m_fRedCur = m_fRedOld;
}
// Aggiorna il timestamp
m_fColorTimestamp = timestamp;
L'ho scritto di getto sicuramente c'è qualche bug  (ok forse più di qualche... :D ) oltre a non essere ottimizzato perchè usa tutti float. Ancora meglio usare un array di 3 (rosso, verde e blu) per cur, old e new e dei cicli for invece di fare tutto componente per componente.

Comunque alla fine di questo codice hai in m_fRedCur un valore tra 0 e 1 che puoi facilmente convertire tra 0 e 255 o farci quello che vuoi, incluse conversioni tra spazi di colore, come da link precedente.

EDIT: e ovviamente c'era il bug, l'if deve testare m_fColorChangeTimer MAGGIORE di 10000, non minore.  ;-)
« Ultima modifica: 14 Febbraio 2012, 14:53:09 CET da undead »

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:colori dinamici
« Risposta #6 il: 14 Febbraio 2012, 15:00:33 CET »
+1
edit: so provando alcuni effetti..per ora ho visto il fadein e fadeout, ma non è un gran che..mi piacerebbe di piu uno scorrimento laterale..
Non avevo visto... l'edit... comunque puoi riusare lo stesso identico codice solo che in questo caso lo 0-1 non si riferisce al colore ma alla "colonna".
In pratica scali il current per la width dello schermo e avendo 2 colori disegni due rettangoli uno che parte da 0 e arriva a current e uno da current a 1. Quando cambi colore si tratta di mettere il nuovo nel vecchio, generare il nuovo così che il ciclo di transizione ricominci...

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:colori dinamici
« Risposta #7 il: 14 Febbraio 2012, 23:13:35 CET »
0
il tuo script mi sembra molto valido..ma prima di poterlo usare mi devo guardare i thread..fino ad oggi non li ho mai usati e non ho proprio idea di come poterli inserire..ho guardato un paio di esempi in rete, ma non ci ho capito molto...domani me li guardo per bene poi provo..
intanto ti metto un thanks per l'aiuto :D
« Ultima modifica: 16 Febbraio 2012, 15:45:20 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:colori dinamici
« Risposta #8 il: 18 Febbraio 2012, 15:51:01 CET »
0
alla fine ho optato per un semplicissimo cambio di colore tramite le dimensioni dei layout..
cosi posso mantenere la visibilità anche per i dispositivi piu datati ^^
non è bella come l'interpolazione, ma l'effetto non mi dispiace :D
grazie mille cmq per l'aiuto, di sicuro lo implementerò in qualche altra app ^^.
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!