Aller au contenu

SurfaceView, Synchronized => manipuler les listes


NicoJa

Recommended Posts

Bonjour,

voilà mes premiers balbuciments sur Android.

Voici un bout de code provenant de droite et de gauche (c'est de saison) sur le net que j'essaye de modifier.

C'est une surfaceview qui affiche une image quand on clique sur l'écran.

Il y a une ArrayList qui contient l'ensemble des images ajoutées à chaque clique et qui est utilisée pour les dessiner.

Mon problème survient dès lors que je veux manipuler cette liste.

Dans ce prototype j'essaye de remplacer une des images de la liste après 8 cliques sur la surface.

Evidemment, cela ne fonctionne pas.

Ma question est donc comment manipuler cette liste pour que je puisse ajouter/supprimer/modifier des éléments et avoir le rendu sur l'écran ?

Merci d'avance pour votre aide,

Nicolas,

ci-dessous le code :

package com.droidnova.android.tutorial2d;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
public class Tutorial2D extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	setContentView(new Panel(this));
}
class Panel extends SurfaceView implements SurfaceHolder.Callback {
	private TutorialThread _thread;
	private ArrayList<GraphicObject> _graphics = new ArrayList<GraphicObject>();
	public Panel(Context context) {
		super(context);
		getHolder().addCallback(this);
		_thread = new TutorialThread(getHolder(), this);
		setFocusable(true);
	}
	private int iter = 0;
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		synchronized (_thread.getSurfaceHolder()) {
			if (event.getAction() == MotionEvent.ACTION_DOWN) {
				iter++;
				GraphicObject graphic = new GraphicObject(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
				graphic.getCoordinates().setX((int) event.getX() - graphic.getGraphic().getWidth() / 2);
				graphic.getCoordinates().setY((int) event.getY() - graphic.getGraphic().getHeight() / 2);
				graphic.id = iter;
				_graphics.add(graphic);
				if (_graphics.size() > 8 && _graphics.size() % 2 == 0) {
					//graphic = _graphics.get(_graphics.size()-1);
					GraphicObject g = new GraphicObject(BitmapFactory.decodeResource(getResources(), R.drawable.pion));
					g.getCoordinates().setX((int) event.getX() - graphic.getGraphic().getWidth() / 2);
					g.getCoordinates().setY((int) event.getY() - graphic.getGraphic().getHeight() / 2);
					iter++;
					g.id = iter;
					_graphics.set(_graphics.size() - 8, g);
				}
			}
			return true;
		}
	}
	@Override
	public void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawColor(Color.BLACK);
		Bitmap bitmap;
		GraphicObject.Coordinates coords;
		String l = "";
		for (GraphicObject graphic : _graphics) {
			bitmap = graphic.getGraphic();
			coords = graphic.getCoordinates();
			l += graphic.id + " ";
			canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null);
		}
		Log.d("list", l);
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		// TODO Auto-generated method stub
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		_thread.setRunning(true);
		_thread.start();
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		boolean retry = true;
		_thread.setRunning(false);
		while (retry) {
			try {
				_thread.join();
				retry = false;
			} catch (InterruptedException e) {
			}
		}
	}
}
class TutorialThread extends Thread {
	private SurfaceHolder _surfaceHolder;
	private Panel _panel;
	private boolean _run = false;
	public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) {
		_surfaceHolder = surfaceHolder;
		_panel = panel;
	}
	public void setRunning(boolean run) {
		_run = run;
	}
	public SurfaceHolder getSurfaceHolder() {
		return _surfaceHolder;
	}
	@Override
	public void run() {
		Canvas c;
		while (_run) {
			c = null;
			try {
				c = _surfaceHolder.lockCanvas(null);
				synchronized (_surfaceHolder) {
					_panel.onDraw(c);
				}
			} finally {
				if (c != null) {
					_surfaceHolder.unlockCanvasAndPost(c);
				}
			}
		}
	}
}
class GraphicObject {
	public class Coordinates {
		private int _x = 100;
		private int _y = 0;
		public int getX() {
			return _x + _bitmap.getWidth() / 2;
		}
		public void setX(int value) {
			_x = value - _bitmap.getWidth() / 2;
		}
		public int getY() {
			return _y + _bitmap.getHeight() / 2;
		}
		public void setY(int value) {
			_y = value - _bitmap.getHeight() / 2;
		}
		public String toString() {
			return "Coordinates: (" + _x + "/" + _y + ")";
		}
	}
	public int id = 0;
	private Bitmap _bitmap;
	private Coordinates _coordinates;
	public GraphicObject(Bitmap bitmap) {
		_bitmap = bitmap;
		_coordinates = new Coordinates();
	}
	public Bitmap getGraphic() {
		return _bitmap;
	}
	public Coordinates getCoordinates() {
		return _coordinates;
	}
}
}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...