Java 用onTouch Android绘制OpenGL ES 2.0线条

Java 用onTouch Android绘制OpenGL ES 2.0线条,java,android,opengl-es,Java,Android,Opengl Es,我已经从android下载并运行了opengl示例。现在,我尝试在用户移动手指时使用opengl es 2.0创建一条线。到目前为止,这就是我所做的: 在我的GlSurfaceView类onTouchEvent方法上: @Override public boolean onTouchEvent(MotionEvent e) { mScaleDetector.onTouchEvent(e); switch (e.getAction()) { case Motion

我已经从android下载并运行了opengl示例。现在,我尝试在用户移动手指时使用opengl es 2.0创建一条线。到目前为止,这就是我所做的:

在我的GlSurfaceView类onTouchEvent方法上:

@Override
public boolean onTouchEvent(MotionEvent e) {
    mScaleDetector.onTouchEvent(e);

    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            float x = e.getX();
            float y = e.getY();

            mPreviousX = x;
            mPreviousY = y;

            // Save the ID of this pointer
            mActivePointerId = e.getPointerId(0);

            break;
        }

        case MotionEvent.ACTION_MOVE: {

            final int pointerIndex = e.findPointerIndex(mActivePointerId);
            final float x = e.getX(pointerIndex);
            final float y = e.getY(pointerIndex);

            if (!mScaleDetector.isInProgress()) {

                mRenderer.setLineCoordinates(mPreviousX, mPreviousY, x, y);
                requestRender();
            }

            mPreviousX = x;
            mPreviousY = y;

            break;
        }

        case MotionEvent.ACTION_UP: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_CANCEL: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = (e.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = e.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mPreviousX = e.getX(newPointerIndex);
                mPreviousY = e.getY(newPointerIndex);
                mActivePointerId = e.getPointerId(newPointerIndex);
            }
            break;
        }
    }

    return true;
}
在我的渲染器类上:

public void onDrawFrame(GL10 gl) {
    // Draw background color
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // Set GL_MODELVIEW transformation mode
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();   // reset the matrix to its default state

    // When using GL_MODELVIEW, you must set the view point
    GLU.gluLookAt(gl, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    gl.glScalef(factor, factor, 0.0f);

    // Draw triangle
    mTriangle.draw(gl);
    mLine.draw(gl);
}
用于更改坐标的渲染器类内的函数:

public void setLineCoordinates(float mPreviousX
        , float mPreviousY, float x, float y) {
    // TODO Auto-generated method stub

    lineCoords[0] = (float) (mPreviousX * 2.0 / WIDTH - 1.0);
    lineCoords[1] = (float) (mPreviousY * -2.0 / HEIGHT + 1.0);
    lineCoords[2] = 0.0f;
    lineCoords[3] = (float) (x * 2.0 / WIDTH - 1.0);
    lineCoords[4] = (float) (y * -2.0 / HEIGHT + 1.0);
    lineCoords[5] = 0.0f;

}
当我移动手指时,没有线条,只有一条移动的细线。。。 我如何在手指不断移动的同时画出整条线并保持画线?当我再次触摸屏幕时,也会启动新线

已更新

谢谢@Gil Moshayof,我现在可以用我的版本来画线了

public void setLineCoordinates(float mPreviousX
        , float mPreviousY, float x, float y) {
    // TODO Auto-generated method stub

    float lineCoords[] = new float[6];
    lineCoords[0] = (float) (mPreviousX * 2.0 / WIDTH - 1.0);
    lineCoords[1] = (float) (mPreviousY * -2.0 / HEIGHT + 1.0);
    lineCoords[2] = 0.0f;
    lineCoords[3] = (float) (x * 2.0 / WIDTH - 1.0);
    lineCoords[4] = (float) (y * -2.0 / HEIGHT + 1.0);
    lineCoords[5] = 0.0f;

    bufferOfArrays.add(new Line(lineCoords));

    if(isFirst) {
        isFirst = false;
        listOfArrays.addAll(bufferOfArrays);
        view.requestRender();
    }

}

public void setFirst(boolean isFirst) {
    this.isFirst = isFirst;
}
然后:

@Override
public void onDrawFrame(GL10 gl) {
    //... color, matrix, look at etc..

    // Draw triangle
    //mTriangle.draw(gl);
    //TODO mLine.draw(gl);

    for(Line line : listOfArrays) {
        line.draw(gl);
    }
    isFirst = true;

}

但是我的应用程序在移动手指时开始变慢,仍然不知道发生了什么

这里的问题是,每次移动时都会设置mPreviousX&mPreviousY。实际上,问题是从您为这些参数选择的名称开始的。更好的名称应该是mLineStartX/Y

在触地事件上设置mLineStartX/Y,然后在每次移动时更新x/Y,并且不更改mLineStartX/Y


至于添加多行,您需要实现更多的逻辑。您需要维护您定义的某个类的数组列表,该类有2个点(2xPointFs)。当用户抬起手指(触碰/触碰取消)时,用2个点创建一个新类,在渲染方法上,确保遍历所有这些线并渲染它们

您必须保留所有线段的列表,并在
onDrawFrame()
中绘制所有线段。现在您只绘制最后一行,每次处理输入时都会替换它。您是否成功完成了它,请给我一个下载源代码的链接?我可以使用它来完成我的免费绘制路径吗?事实上,我并不是想要画一条直线,而是想画一条在我移动手指时画出手指轨迹的路径。然后你应该按照我写的第二部分去做。每次移动时,都需要在列表中添加2个点(表示一条线)。然后,在绘制时,需要生成(或在此之前生成)表示所有这些线段的顶点缓冲区列表。基本上,您应该有一个“行”列表,其中触碰创建一个新实例,触碰(或取消)将新实例添加到列表中。谢谢您的回答非常有用!我现在可以画自由形式的线了,但系统似乎变慢了