当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建对象列表

方楷
2023-03-14

我有一个名为MarkerCustom的类文件。MarkerCustom有一个构造函数,它接受三个不同类型的变量

public MarkerCustom(int myInt, String, myString, BitmapData myBitmap) {

从我的main Main活动中,我希望加载一个GLSurface视图,该视图将获取MarkerCustom的每个实例的ArrayList,我希望将这些实例与将传递给MarkerCustom的构造函数的每个实例的数据一起加载到GLSurface中。

让我们调用数组列表myMarkers

我需要myMarkers看起来像这样:

myMarkers[0] = [1, "hello", bitMapData1]
myMarkers[1] = [66, "johnHandy", bitmapData2]

我对java相当陌生,它的铸造等让我有点困惑,因为来自AS3

编辑

因此,按照AKhill在下面的答案,我编辑了我的GL表面视图以接受如下所示的数组列表。但是,需要从构造函数中该 ArrayList 中列出的每个类创建标记自定义类,其方式使其可在 GLSurFaceView 的“曲面创建”和“绘制框架”方法中访问。

请参阅下面的此类方法和 for 循环/注释:

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) {


    }


}

这里仅供参考的是我的< code>MarkerCustom类

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);

    }

}

共有3个答案

满和安
2023-03-14

在这种情况下,我认为创建一个具有三个属性的类标记器(例如)更容易。例如:

class Marker {

int var1;
String var2;
BitmapData var3; }

这样,您就可以存储标记数组列表(ArrayList),并且可以访问您需要的所有信息。

石正奇
2023-03-14

速记:

List<MarkerCustom> markerList = Arrays.asList(
    new MarkerCustom(1, "hello", bitMapData1),
    new MarkerCustom(66, "johnHandy", bitMapData2))
};
卓嘉良
2023-03-14

试试这个。

List<MarkerCustom> myList=new ArrayList<MarkerCustom>();
MarkerCustom entry1=new MarkerCustom(myInt, myString, myBitmap);
MarkerCustom entry2=new MarkerCustom(myInt, myString, myBitmap);

myList.add(entry1);
myList.add(entry2);
 类似资料:
  • 本文向大家介绍如何在Java中创建String对象?,包括了如何在Java中创建String对象?的使用技巧和注意事项,需要的朋友参考一下 您可以通过以下方式创建字符串: 将包装在“”中的字符串值分配给String类型变量。 通过将字符串值作为其构造函数的参数传递,使用new关键字创建String类的对象。 将字符数组传递给String构造函数。

  • 问题内容: 如何在Python中创建对象(类实例)列表? 还是这是不良设计的结果?我需要这个原因是因为我有不同的对象,并且需要在以后的阶段中处理它们,所以我将继续将它们添加到列表中,然后再调用它们。 问题答案: 存储对象实例列表非常简单

  • 我试图创建一个由子类定义的对象数组(我认为这是正确的术语)。我可以看到这个问题反复出现,但实现仍然存在问题。 我的代码 给出错误 线程“main”java.lang.NullPointerException中出现异常。 为了使其合理化,我将其分解为最简单的术语: 这似乎奏效了。我只是看不出我的两个例子有什么不同。我知道我的第一个没有意义,但是MyClass最终会包含更多的数据。) 我很肯定这个问题

  • 此处使用的运算符不能用于所使用的值类型。您要么在这里使用了错误的类型,要么使用了错误的运算符

  • 问题内容: 我们如何用Swift语言(例如&在Objective-C中)创建唯一的对象列表。 问题答案: 从Swift 1.2(Xcode 6.3 beta)开始,Swift具有本机集合类型。从发行说明中: 包括一个新的数据结构,该结构提供具有完整值语义的独特元素的通用集合。它与之桥接,提供与和类似的功能。 以下是一些简单的用法示例: 但是还有更多可用的方法。 更新: 现在,集合也记录在Swift

  • 问题内容: 这段代码是如何工作的,我完全感到困惑。 问题答案: 使用该语法,您可以创建一个完全合法的匿名类。 在内部,匿名类被编译为它们自己的类,在封闭类的名称位于符号之前的地方称为该类。并为每个其他匿名类增加。这意味着正在创建以下类: 然后,编译中的代码以在内部使用新定义的匿名类: