2010-07-29 14 views
32

Sto cercando di creare un widget che supporti l'animazione, idealmente tramite il framework android.view.animation, altrimenti impostando le proprietà sulle viste remote nel codice attivato da un servizio in background.Animazioni widget Android homescreen

Qualcuno ha esperienza con entrambi questi approcci, ed è ciò che sto provando a fare, o sto andando su un vicolo cieco?

+0

Guardando nella stessa , se lo avessi già fatto, sarebbe bello se tu potessi condividere la tua soluzione qui. – Bachi

+1

Certo: proverò a trovare il tempo per scriverlo. In sostanza, il trucco consiste nel definire i layout in cui sono incorporate le animazioni iniziali, quindi impostare tali layout quando sono richieste animazioni. IIRC è necessario passare a un nuovo layout per attivare l'animazione, quindi potrebbe essere necessario disporre di più layout con la stessa animazione e alternare tra loro. È anche utile impostare un timer per tornare a una versione non animata del widget una volta completata l'animazione, altrimenti tornare alla schermata iniziale può attivare nuovamente l'animazione. – Adrian

+0

quale si desidera controllare dal servizio in background, dal layout o dall'animazione? Potresti descrivere la domanda in dettaglio? – MoiTempete

risposta

12

in realtà è possibile animare i widget remoteview. Il problema è che è super restrittivo che è di progettazione a causa delle implicazioni di sicurezza nell'esecuzione di codice personalizzato in un processo di sistema.

Ciò che intendo è che Android funzionerà solo con animazioni espresse in file Xml res/anim che sono legati ai layout tramite xml. Alcuni widget RemoteView supportano questo

Un esempio di questo è il widget dell'app Notizie e Meteo che viene fornito su un sistema Android di magazzino. Quello che sta facendo è usare ViewFlipper per scorrere ogni notizia ogni 10 secondi circa.

<ViewFlipper android:layout_width="match_parent" android:layout_height="wrap_content" android:measureAllChildren="true" android:flipInterval="10000" android:autoStart="true" 
android:inAnimation="@android:anim/fade_in" android:outAnimation="@android:anim/fade_out" android:animateFirstView="true"> 
     <TextView android:id="@+id/Description1TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/> 
     <TextView android:id="@+id/Description2TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/> 
     <TextView android:id="@+id/Description3TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/> 
     <TextView android:id="@+id/Description4TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/> 
    </ViewFlipper> 

In questo esempio è possibile associare intenti in sospeso a ogni TextView. Pertanto, quando un utente fa clic su uno, può verificarsi un'azione diversa.

Infine, Android ha aggiunto lentamente il supporto per le visualizzazioni animate in ciascuna versione. Ad esempio TransitionDrawables (selettore a dissolvenza incrociata) non cross-fade fino a Android 3.0.

0

animazioni sono impossibili su RemoteViews, e gli aggiornamenti RemoteViews può avvenire a una velocità di una volta ogni 30 minuti (o manualmente) ...

In ogni caso, si può provare il seguente link: is-there-a-way-to-animate-on-a-home-widget

2

Puoi hai solo semplici animazioni come fadeIn o fadeOut sul tuo widget, è molto semplice, non hai bisogno di animazioni di layout, usa ViewFlipper (mi ci sono voluti 3 giorni di ricerca per scoprire che è così facile).

Eppure è imposiible di scrivere qualcosa di veramente grande senza utilizzare lanciatori personalizzati

2

È possibile, ma usarlo con cautela, poiché è molto pesante per l'implementazione di homescreen di default e non dovresti usarlo molto spesso.

Nel Mario Coin Block widget, sto usando questa tecnica per fare l'animazione, potete verifica il codice sorgente: http://code.google.com/p/mario-coin-block/source/browse/trunk/MarioWidget.CoinBlock/src/com/gueei/mario/coinBlock/view/CoinBlockView.java

In sostanza l'idea è disegnare manualmente su una bitmap fuori schermo, e sostituire bitmap del BitmapView con esso usando RemoveViews Chiamata.

1

Sono d'accordo con le altre risposte qui, quindi non lo farò nuovamente: l'animazione limitata su un widget è possibile ma, a causa delle risorse, potrebbe rendere la schermata iniziale lenta e meno reattiva, e lo scaricatore della batteria. Dalla mia esperienza, non scorre liscio. Quindi la linea di fondo è - è ok se solo qualche frame cambia di volta in volta, o per alcuni effetti raramente su un evento (ad esempio stampa dell'utente o qualche evento dal tuo servizio.

Ma ecco un'idea che probabilmente non risponde direttamente alla tua domanda, ma potrebbe essere un'alternativa adatta (non conosco il tuo caso d'uso, potrebbe non essere affatto pertinente) Hai considerato l'implementazione di uno sfondo live?

pro - animazione di alta qualità, possono essere controllate dallo sfondo

cons - non interattivo, sostituisce carta da parati per l'utente ... ed è difficile da soddisfare di tutti gusto