2010-07-07 8 views
5

Sto scrivendo una carta da parati dal vivo e io uso la funzione:Android live wallpaper onOffsetsChanged xPixelOffset non sembra tornare il vero pixel compensato

public void onOffsetsChanged(float xOffset, float yOffset, 
      float xOffsetStep, float yOffsetStep, int xPixelOffset, 
      int yPixelOffset) 

per vedere quando gli usi colpi attraverso ad un altro schermo, e ho utilizzato xPixelOffset per vedere quanto lo schermo è spostato in pixel, ma non restituisce il numero di pixel mi aspetterei.

Per ciascuna delle 5 schermate del desktop che mostra l'offset di essere pixel 0, -80, -160, -240, -320 tuttavia ci si aspetterebbe che fosse compensato dalla larghezza dello schermo ogni volta (240px piuttosto che 80px)

mi sto perdendo qualcosa?

risposta

7

Si noterà che quando si scorre, il primo piano della schermata iniziale (icone, widget, ecc.) Si sposta verso sinistra o destra per la larghezza dello schermo intero, ma l'immagine di sfondo (o lo sfondo animato) si sposta solo di una frazione di quella larghezza. Il risultato ovvio è un effetto di scroll parallasse.

Per dirla in un altro modo, end-to-end i tuoi 5 schermi ammontano a qualcosa come 1200px (5 x larghezza dello schermo), ma la larghezza massima di uno sfondo sullo stesso display è qualcosa come 480px (2 x larghezza dello schermo) , perché la parte posteriore non scorre tanto quanto quella frontale.

Gli offset, quindi, non dovrebbe essere usato come una misura di quanto in primo piano del display si è mosso, ma fino a che punto lo sfondo è spostato.

così si sta ancora ricevendo le informazioni di cui avete bisogno dal parametro offset. È solo che la tua interpretazione di questa informazione deve cambiare un po '.

+0

Sì, ma come sto scrivendo una carta da parati dal vivo ho bisogno di fare questo effetto Paralax accadere, perché per impostazione predefinita la carta da parati è statica. Quindi voglio sapere quante "schermate" l'utente ha spostato e sapere quale sarà il numero massimo di schermo, in quanto questo può cambiare a seconda della schermata principale o dell'applicazione utilizzando lo sfondo animato. – stealthcopter

+1

Nota utile, float xOffset restituisce l'offset in unità normalizzate (0.0 - 1.0) in modo da poter sapere quando viene raggiunto il massimo. – stealthcopter

2

Basta avere il tuo canvas/bitmap su cui disegnare le dimensioni dell'intero sfondo virtuale (che dovrebbe avere dimensioni screenWidth * 2, screenHeight), quindi disegnarlo sulla superficie surfaceHolder usando xPixelOffset come coordinata x. Questo è il modo semplice.

naturalmente non c'è nessuna legge che lo sfondo virtuale ha bisogno di quelle dimensioni. Se lo desideri, potrebbe scorrere alla velocità delle icone. Questo è quando si vorrà utilizzare il valore xOffset per capire compensare il proprio pixel.

0
  if(xPixelOffset != 0){ 
       myXPixelOffset = xPixelOffset*((backgroundWidth - screenwidth)/screenwidth); 
      } 

backgroundWidth dovrebbe ape ScreenHeight * 2

Problemi correlati