Comment puis-je créer une liste d'Objets en Java
J'ai un fichier de classe appelé MarkerCustom. MarkerCustom a un constructeur qui prend trois variables de types différents.
public MarkerCustom(int myInt, String, myString, BitmapData myBitmap) {
De principal de mon activité Principale, je veux charger un GLSurface vue d'une liste de tableaux de chaque instance de MarkerCustom que je veux charger dans le GLSurface avec les données qui sera passé dans chaque instance de MarkerCustom du constructeur.
Permet d'appeler la Liste de Tableau myMarkers
;
j'ai besoin de myMarkers
à ressembler à ceci:
myMarkers[0] = [1, "hello", bitMapData1]
myMarkers[1] = [66, "johnHandy", bitmapData2]
je suis assez nouveau à java et son casting ect me confond un peu venir de AS3
MODIFIER
Faire à la suite de AKhill la réponse ci-dessous j'ai édité mon GLSurfaceView
à accepter une liste de tableaux comme indiqué ci-dessous. Mais le MarkerCustom
les besoins de la Classe à être créé à partir de chaque énumérés dans cette liste de tableaux dans le constructeur d'une manière que le son est accessible dans le onSurfaceCreate
et la onDrawFrame
méthode de la GLSurfaceView
Veuillez consulter les méthodes et les boucles for/commentaires dans cette catégorie ci-dessous:
public class GLLayer extends GLSurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback, Renderer {
private Context context;
ArrayList <MarkerCustom> locationTags;
private PhoneOrientation phoneOri;
public GLLayer(Context context, int orientation, ArrayList<MarkerCustom> custMarkers) {
super(context);
locationTags = custMarkers;
this.context = context;
phoneOri=new PhoneOrientation(context); //sensor manager and interpreter
for(int i =0; i<locationTags.size(); i++){
//Need to create a an instance of each MarkerCustom
//something like MarkerCustom locationTags[i]; = new MarkerCustom (its params);
}
this.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
this.setRenderer(this);
phoneOri.start(context, orientation);
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0, 0, 0, 0, 0, 0, 0, 0, 0);
float floatMat[]=phoneOri.getMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadMatrixf(floatMat, 0);
for(int i=0;i<loacationTags.size();i++){
gl.glPushMatrix();
//locationTags[i].draw(gl);
gl.glLoadMatrixf(floatMat,0);
}
gl.glPushMatrix();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
if(height == 0) {
height = 1;
}
float ratio = (float) width / height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 35.0f, (float)width / (float)height, 5.0f, 200.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 1.0f, 5.0f, 0, 0, 0, 0, 1.0f, 0);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
for(int i=0;i<locationTags.size();i++){
//call each MarkerCustom's loadGLTexture Method
//locationTags[i].loadGLTexture(gl, this.context);
}
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_SMOOTH);
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
}
Et Juste pour la référence ici est mon MarkerCustom
classe
public class MarkerCustom {
public float xPos;
public float yPos;
public float zPos;
public float yaw;
public float pitch;
public Bitmap tagImage;
private FloatBuffer vertexBuffer; //buffer holding the vertices
private float vertices[] = {
0.0f, -10.0f, -10.0f, //V1 - bottom left
0.0f, -10.0f, 10.0f, //V2 - top left
0.0f, 10.0f, -10.0f, //V3 - bottom right
0.0f, 10.0f, 10.0f //V4 - top right
};
private FloatBuffer textureBuffer; //buffer holding the texture coordinates
private float texture[] = {
//Mapping coordinates for the vertices
0.0f, 1.0f, //top left (V2)
0.0f, 0.0f, //bottom left (V1)
1.0f, 1.0f, //top right (V4)
1.0f, 0.0f //bottom right (V3)
};
public MarkerCustom(float x, float y, float z, float yawAngle, float pitchAngle, Bitmap bitmap) {
xPos = x;
yPos = y;
zPos = z;
yaw = yawAngle;
pitch = pitchAngle;
tagImage = bitmap;
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuffer.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
byteBuffer = ByteBuffer.allocateDirect(texture.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
textureBuffer = byteBuffer.asFloatBuffer();
textureBuffer.put(texture);
textureBuffer.position(0);
}
/** The texture pointer */
private int[] textures = new int[1];
public void loadGLTexture(GL10 gl, Context context) {
//loading texture
//Enable blending using premultiplied alpha.
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
//generate one texture pointer
gl.glGenTextures(1, textures, 0);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//create nearest filtered texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//Use Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, tagImage, 0);
//Clean up
tagImage.recycle();
}
public void draw(GL10 gl) {
//bind the previously generated texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//Point to our buffers
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//Set the face rotation
gl.glFrontFace(GL10.GL_CW);
//Point to our vertex buffer
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//Draw the vertices as triangle strip
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
}
OriginalL'auteur erik | 2012-07-15
Vous devez vous connecter pour publier un commentaire.
De l'essayer.
oui cela va fonctionner.
merci... désolé pour ma mise en forme.. je ne sais pas comment faire des blocs de code dans les commentaires.. juste pour être clair, je peux dire que les résultats de[i][0]?
les résultats d'un tableau ou d'une liste?? parce que les résultats.la taille est seulement pour la liste.pour les tableaux c'est les résultats.longueur.
je n'ai pas descided encore.. en gros je vais avoir une table en ligne, dans un base de données mySQL que je vais ping via un serveur de script côté. (probablement php) c'est là que je suis un peu confus avec java.. en actionscript un tableau est un tableau et n'a pas une taille fixe.. mais en java, un tableau a une taille fixe à droite?
OriginalL'auteur Akhi
Abrégée:
ok je pense que c'est sur le droit chemin.. mais serait-ce de travailler si je vais avoir une liste de données en ligne, et puis dire quelque chose comme: for(int i=0; i<résultats.taille; i++){ MarkerCustom tempMarker = new MarkerCustom(résultats[i][0], [i][1], [i][2]); markerList.ajouter(tempMarker); }
Comme cette liste est fixe, la méthode add n'est pas disponible. Par conséquent, vous devez utiliser la démarche indiquée ci-dessus par Akhil Dev.
OriginalL'auteur Reimeus
Dans ce cas, je pense qu'il est plus facile de créer une classe Marqueur (par exemple) qui comporte trois attributs.
Par exemple:
De cette façon, vous êtes capable de stocker une liste de tableaux de Marqueurs (ArrayList), et vous pouvez accéder à toutes les informations dont vous avez besoin.
OriginalL'auteur Safime