By Excilys
Développeur Android et JEE chez Excilys.
Formateur Android.
Publiée par NBC News.
Publié par NBC News. L'une de 2005 lors des funérailles de Jean-Paul II, l'autre de 2013, pendant la présentation du nouveau pape François.<activity android:name=".MainActivity" android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation">C'est une approche complètement différente du développement d'applications classiques où l'on utiliser les composants (widget) fournis par le framework. En jeux-vidéo, on dessine tout.
onResume = resume the game
onPause = pause the game
public class CustomView extends View { // ... @Override protected void onDraw(Canvas canvas) { canvas.save(); // make your changes canvas.drawRect(...); canvas.drawPath(...) canvas.restore(); } }
Important: Le rendu est fait sur l'UIThread.
Récupérer le canvas utilisé pour dessiner sur la "Surface"
Canvas canvas = getHolder().lockCanvas()
Affichage de la "Surface" à l'écran
getHolder().unlockCanvasAndPost(Canvas canvas)
Savoir si la surface est prête
SurfaceHolder.Callback.surfaceCreated(SurfaceHolder holder) SurfaceHolder.Callback.surfaceDestroyed(SurfaceHolder holder)ou
boolean isCreated = holder.getSurface().isValid();
Relatif au projet "Spaceship" !
Exercices d'entraînement.
N'oubliez pas d'effectuer le rendu dans un autre thread.
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/>
Permet de vérifier que le device est compatible.
Autres exemples:
<uses-feature android:name="android.hardware.bluetooth" /> <uses-feature android:name="android.hardware.camera" />
// Récupérer le type d'action int action = event.getActionMasked(); // Récupérer l'index int actionIndex = event.getActionIndex(); // Récupérer l'id du pointeur int pointerId = event.getPointerId(actionIndex);Différence entre index et pointeurId. L'index est l'index dans un tableau de données relatif au MotionEvent en cours. Le pointerId identifie un pointeur en particulier. A partir de l'index vous pouvez récupérer l'identifiant du pointeur. C'est par le biais de l'index que vous allez pouvoir accéder aux données de l'Event. actionIndex = id données du MotionEvent pointerId = id du pointeur
Actions possibles
switch (action) { case MotionEvent.ACTION_UP: // premier touch uniquement case MotionEvent.ACTION_POINTER_UP: // autres touch case MotionEvent.ACTION_DOWN: // premier touch uniquement case MotionEvent.ACTION_POINTER_DOWN: // autres touch case MotionEvent.ACTION_MOVE: // tous les touch }
La classe MotionEventCompat, disponible dans la librairie support-v4, intégre la nouvelle API.
Veillez à avoir compris la différence entre actionIndex et pointerId
Your project/ |_ assets/ |_music/ |_bfx/ |_image/ |_src/ |_res/Susceptible d'avoir un paquet de fichiers pour tout ce qui est images / music / sons. Il est nécessaire de travailler avec une hiérarchie de dossier bien organisé. Le système de ressources de base ne permet pas cette flexibilité. Res folder: si dossier pas supporté -> compile error placer des fichiers ressources dans un sous-dossier d'un dossier de ressources (layout ou autre) => dossier ignoré mais pas de compile errors Assets => flexibilité
try { // à partir d'un Context on récupère l'AssetManager AssetManager assetManager = getAssets(); // plusieurs méthodes à disposition pour charger un fichier InputStream inputStream = assetManager.open("dir1/file_name"); AssetFileDescriptor fd = assetManager.openFd("dir1/file_name"); } catch (IOException e) { Log.e(TAG, "problem during files loading", e); }
Activity.setVolumeControlStream (int streamType)
On va utiliser le MediaPlayer.
try { // on set le fichier audio mediaPlayer.setDataSource(...); // on prépare l'audio mediaPlayer.prepare(); // on commence à jouer l'audio mediaPlayer.start(); mediaPlayer.pause(); mediaPlayer.stop(); } catch (IOException e) { Log.e(TAG, "Problem during audio loading", e); }
Besoin de jouer plusieurs son rapidement et simultanément.
// Création d'un SoundPool // 10 = nb max de sons joués simultanément // STREAM_MUSIC = type de stream sur lequel seront joué les sons SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, O); AssetFileDescriptor fd = assetManager.openFd("path_to_the_file"); // pré-charge le son sound1 = soundPool.load(fd, 1); // ... // on joue le son correspondant à l'ID donné soundPool.play(sound1, 1, 1, 0, 0, 1);
bfxr.net, pour générer des sons de jeux en ligne.
dig.ccmixter.org, pour télécharger des musiques de jeux libres de droit.
Être un bon citoyen Android
AudioManager am = ...; // On demande le focus de l'audio am.requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, ...); // On restitue le focus de l'audio am.abandonAudioFocus(AudioManager.OnAudioFocusChangeListener l);
// AudioManager.OnAudioFocusChangeListener @Override public void onAudioFocusChange(int focusChange) { if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Récupération du son suite à une perte // on continue de jouer si on revient d'une pause // ou on rejoue le son depuis le début si c'était un stop // ou encore on restitue le niveau de volume // tout dépend du type de AUDIOFOCUS_LOSS } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { // perte de l'audio focus pour une longue durée // mettre en stop } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) { // perte de l'audio focus pour une petite durée // mettre en pause } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { // perte de l'audio focus pour une petite durée et // possibilité de jouer un son en même temps // Baisser le volume } }
BitmapFactory.decodeFile("path_name"); //... BitmapFactory.decodeFileDescriptor(aFileDescriptor); //... BitmapFactory.decodeResource(res, R.drawable.my_bitmap);
Utiliser le canvas!
// Dessiner un bitmap Canvas.drawBitmap(...);
Versions inférieures à Honeycomb 3.0 (Api 11)
Quand un Bitmap est inutilisé -> Bitmap.recycle()
Native heap vs Dalvik's heap.
Depuis Honeycomb: on peut recycler un bitmap.
BitmapFactory.Options options = new BitmapFactory.Options(); options.inBitmap = recycledBitmap; // ... BitmapFactory.decodeFile("my_file_path", options); // ou BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); // ...
Ajouter des images.