IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Mobile en Java Discussion :

[Projet] Widget + Sprite Animé


Sujet :

Développement Mobile en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut [Projet] Widget + Sprite Animé
    Hello,

    Je me suis mis récemment au développement sur Android, j'ai suivi quelques tutoriels et je me retrouve aujourd'hui confronté à un problème de compréhension par rapport aux Views et au fonctionnement des Widgets.

    Dans l'absolu, mon but est de créer un Widget de type tamagotchi, avec une application qui se lancerai en appuyant dessus.

    Pour l'instant je souhaiterai juste afficher un sprite animé dans un Widget.

    J'ai commencé par suivre ce tuto : http://sberfini.developpez.com/tutor...oid/appwidget/

    J'ai réussi à tout faire fonctionner sans la classe de Configuration, mais dès que je lie cette dernière à l'Activity j'ai une erreur au moment où je souhaite ajouter le Widget sur le bureau :
    Nom : permission_error.jpg
Affichages : 158
Taille : 262,5 Ko

    Si ça parle à quelqu'un je suis preneur, je me prends la tête dessus depuis une heure, et mes recherches sur Google ne m'ont remonté que le fait d'ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:permission="android.permission.ACCESS_CHECKIN_PROPERTIES"
    dans main.xml mais ça n'a rien changé.

    Voilà dans un premier temps ce qui me bloque, toute aide est la bienvenue, merci =)



    main.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/napply_widget_layout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/hello_world"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" />
    </LinearLayout>
    widget_meta.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:minWidth="72dp"
        android:minHeight="146dp"
        android:initialLayout="@layout/main"
        android:updatePeriodMillis="0"
         android:configure="com.game.widget.ConfigurationTamagotchiActivity" >
    </appwidget-provider>
    AndroidManifest.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="com.game.widget" 
    	android:versionCode="1"
    	android:versionName="1.0"> 
    	<uses-sdk android:minSdkVersion="10" />
    	<application
    	    android:icon="@drawable/ic_launcher"
    	    android:label="@string/app_name"
    	    android:permission="android.permission.ACCESS_CHECKIN_PROPERTIES">
    		<!-- Notre AppWidget -->
    		<receiver android:name=".TamagotchiActivity">
    			<intent-filter>
    				<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    			</intent-filter>
    			<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_meta" />
    		</receiver>
     
    		<activity android:name="ConfigurationTamagotchiActivity"
    		    android:permission="android.permission.ACCESS_CHECKIN_PROPERTIES">
    		    <intent-filter>
    				<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
    			</intent-filter>
    		</activity>
    	</application>
    	<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"  />
    </manifest>
    TamagotchiActivity.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package com.game.widget;
     
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.Context;
    import android.widget.RemoteViews;
     
    public class TamagotchiActivity extends AppWidgetProvider {	
    	/** Called when the activity is first created. */
    	@Override
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    			int[] appWidgetIds) {
     
    		final int N = appWidgetIds.length;
    		// Pour chaque AppWidget MonWidgetDeveloppez (n'oubliez pas qu'on peut en ajouter tant qu'on veut), on les met à jour
    		for (int i = 0; i < N; i++) {
    			int appWidgetId = appWidgetIds[i];
    			updateAppWidget(context, appWidgetManager, appWidgetId);
    		}
    	}
     
    	static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
    		// On récupère les Views de notre layout
    		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);
    		// On peut agir sur ces vues
    		views.setTextViewText(R.id.hello_world, "Hello Developpez !");
    		System.out.println("Hello World");
    		// On met ensuite à jour l'affichage du widget
    		appWidgetManager.updateAppWidget(appWidgetId, views);
    	}
    }
    ConfigurationTamagotchiActivity.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    package com.game.widget;
     
    import android.app.Activity;
    import android.appwidget.AppWidgetManager;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
     
    public class ConfigurationTamagotchiActivity extends Activity {
    	//private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		System.out.println("Config");
     
    		// On essaye de récupérer l'id de l'AppWidget
    //		Intent intent = getIntent();
    //		Bundle extras = intent.getExtras();
    //		if (extras != null) {
    //			mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
    //					AppWidgetManager.INVALID_APPWIDGET_ID);
    //		}
     
    		// Si l'intent ne contient pas son ID, ça ne sert à rien de continuer.
    //		if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
    //			setResult(RESULT_CANCELED);
    //			finish();
    //		}
     
    		// Sinon on le configure comme prévu
    //		configureWidget(getApplicationContext());
     
    		// IMPORTANT : penser à renvoyer l'ID du widget
    //		Intent resultValue = new Intent();
    //		resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    //		setResult(RESULT_OK, resultValue);
    //		finish();
     
     
    	}
     
    	// Une fois encore, libre à vous de faire ce que vous voulez.
    	// Ici j'appelle la fonction update de mon Widget pour l'initialisation,
    	// mais il ne tient qu'à vous d'en faire autre chose.
    //	public void configureWidget(Context context) {
    //		AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    //		TamagotchiActivity.updateAppWidget(context, appWidgetManager,mAppWidgetId);
    //	}
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Ok j'ai réussi à résoudre le problème de permission, en fait j'ai juste retiré les attributs de permission dans le manifest, qui ressemble maintenant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="com.game.widget" 
    	android:versionCode="1"
    	android:versionName="1.0"> 
    	<uses-sdk android:minSdkVersion="10" />
    	<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"  />
    	<application
    	    android:icon="@drawable/ic_launcher"
    	    android:label="@string/app_name">
    		<!-- Notre AppWidget -->
    		<receiver android:name=".TamagotchiActivity">
    			<intent-filter>
    				<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    			</intent-filter>
    			<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_meta" />
    		</receiver>
     
    		<activity android:name="ConfigurationTamagotchiActivity">
    		    <intent-filter>
    				<action android:name="android.intent.action.MAIN" />
    			</intent-filter>
    		</activity>
    	</application>
    </manifest>
    Maintenant que j'arrive à lancer un Widget et sa classe de Config, j'aimerai pouvoir ajouter un bitmap dedans, pour celà je vais m'inspirer d'un autre tutoriel : http://www.edu4java.com/androidgame/androidgame2.html

    C'est là que j'ai du mal à comprendre les Views, dans le cas du Widget, le contenu est modifié par TamagotchiActivity qui étends AppWidgetProvider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);
    		views.setTextViewText(R.id.hello_world, "Hello Developpez !");
    		appWidgetManager.updateAppWidget(appWidgetId, views);
    Alors que dans le cas du dernier tuto, les bmp sont ajouté via une classe GameView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.game.widget;
     
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.view.View;
     
    public class GameView extends View {
    	private Bitmap bmp;
     
    	public GameView(Context context) {
    		super(context);
    		bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    	}
     
    	@Override
    	protected void onDraw(Canvas canvas) {
    		canvas.drawColor(Color.BLACK);
    		canvas.drawBitmap(bmp, 10, 10, null);
    	}
    }
    Et le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setContentView(new GameView(this));
    était simplement ajouté dans le onCreate de l'Activity.

    Donc voilà, dans le cas du Widget je ne vois pas trop où insérer l'image, et je ne sais pas non plus si un setContentView est efficace dans la classe de Configuration.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Ok, j'aurai du mieux lire la doc, apparemment on ne peut pas (encore) ajouter au Widget une classe qui extends View.

    http://stackoverflow.com/questions/5...to-remoteviews

    http://developer.android.com/guide/t...CreatingLayout

    C'est bien dommage =(


    Du coup je me rabats sur la création d'un wallpaper :
    http://developer.android.com/resourc...allpapers.html

    Afin de pouvoir créer une animation visible sur le desktop.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Je reviens, pour ceux que ça intéresserait, en fait je suis parvenu à animer un sprite dans un Widget, mais j'ai dû un peu tricher.

    J'ai d'abord découpé le sprite en plusieurs images, puis dans la classe de Configuration du Widget j'ai simplement utilisé une boucle avec un timer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Runnable runnable = new Runnable() {
    			@Override
    			public void run() {
    				while(TamagotchiActivity.run){
    					try {
    						Thread.sleep(500);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					handler.post(new Runnable() {
    						@Override
    						public void run() {
    							configureWidget(getApplicationContext());
    						}
    					});
    				}
    			}
    		};
    L'enchaînement des images se fait dans la methode updateAppWidget de l'AppWidgetProvider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    	static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
    		// On récupère les Views de notre layout
    		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);
    		// On peut agir sur ces vues
    		Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.bad1_02);
    		if(x == 1){
    			bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.bad1_01);
    		}
    		else if(x == 3){
    			bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.bad1_03);
    			x =  -1;
    		}
    		x++;
    		views.setBitmap(R.id.image, "setImageBitmap", bmp);
    		// On met ensuite à jour l'affichage du widget
    		appWidgetManager.updateAppWidget(appWidgetId, views);
    	}
    Ensuite j'ai juste à avoir un booléen "run" à true dans mon AppWidgetProvider, et à le passer à false quand je veux arrêter l'animation, par exemple quand le Widget est supprimé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    	public void onDeleted(Context context, int[] appWidgetIds){
    		run = false;
    	}
    J'ai uploadé le projet complet si ça peut servir à quelqu'un : http://www.megaupload.com/?d=5I0REG1C

    Bon c'est quand même ultra simpliste, ce sont juste 3 images qui s'alternent via un setBitmap sur une remoteViews, mais le code peut servir à animer un gif qu'on aurait séparé en plusieurs images par exemple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sprite animé en 2D
    Par Mat26_ dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/09/2008, 20h02
  2. Projet : génération d'animations 2D en Python
    Par kromartien dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 04/11/2007, 11h11
  3. Organisation d'un projet Flash/Plusieurs animations
    Par preempalver dans le forum Flash
    Réponses: 3
    Dernier message: 28/06/2007, 12h17
  4. Sprites animés
    Par Heliopraetor dans le forum DirectX
    Réponses: 4
    Dernier message: 16/06/2005, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo