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

用onTouch Android绘制OpenGL ES2.0线

松霖
2023-03-14
@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;

}

当我移动手指时,没有线,只有一条移动的小线...我怎样才能画出整条线,并在我不断移动手指的同时保持线描?当我再次触屏时,也开始新的一行。

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;

}

共有1个答案

卜盛
2023-03-14

这里的问题是,您总是在每一步都设置mPreviousX和mPreviousY。实际上,问题始于您为这些参数选择的名称。更好的名称是mlinestartx/y。

设置mlineStartx/y,然后每次移动都更新x/y,不要更改mlineStartx/y。

至于添加多行,您需要实现更多的逻辑。您需要维护您定义的具有2point(2xpointfs)的某个类的数组列表。当用户举起手指(touch up/touch cancel)时,用2点创建一个新的类,在render方法上,确保遍历所有这样的行并呈现它们。

 类似资料:
  • 问题内容: 这是我的问题…: 在我的活动中,我有一个和一个。我希望Button仅在显示某个可绘制对象时才执行操作。是的,这意味着该代码正在各种可绘制对象之间进行动画处理,从而使其不会中断我想要完成的工作。 没用 并且我将其范围缩小到“ if(vari(drawabledrawable == acertaindrawable)”行的错误。尽管Eclipse并没有公然报告两个可绘制对象是否相同的And

  • 许多插件,比如buttons,自己就做了它们所有的绘制工作。比如你仅仅需要告诉它们你想看到的标签、你想它们使用的字体、绘制按钮的轮廓和焦点矩形。有时候,有必要做些自定义的绘制。在这种情况下,一个 GtkDrawingArea控件可能是正确的选择,这个控件提供了一个画布,在这个画布上你可以绘制并且将其连接到”draw“信号。 控件的内容常常需要被部分或者全部重新绘制。比如,当另一个窗口控件被移动并且

  • 问题内容: 我想在PDFBox中用透明线绘制线条和多边形。这是一些有关如何绘制蓝线的示例代码,但是我无法弄清楚更改颜色的Alpha值。 问题答案: 您不能使用的alpha值,因为PDFBox仅使用RGB值。根据它的javadoc 只是: 设置描边颜色,指定为RGB。 一种选择是将背景色设置为描边色,以使线条不可见。 注意- 不可见!=透明(因此您不会获得透视效果)

  • 绘制线        点击菜单栏或底下快捷工具栏中的“绘制线”按钮,按照弹出对话框进行线的绘制。        使用鼠标在地图上连续点击,双击完成线的绘制后弹出属性信息对话框,可以在“说明”栏中查看并修改对于该线的说明。        在“空间信息”栏中可以看到节点的坐标信息,双击一个节点的坐标信息后可修改该节点的坐标信息,也可在三维地球上选中节点直接移动修改。        在“样式”栏修改线的

  • 绘制线        点击菜单栏或底下快捷工具栏中的“绘制线”按钮,按照弹出对话框进行线的绘制。        使用鼠标在地图上连续点击,双击完成线的绘制后弹出属性信息对话框,可以在“说明”栏中查看并修改对于该线的说明。        在“空间信息”栏中可以看到节点的坐标信息,双击一个节点的坐标信息后可修改该节点的坐标信息,也可在三维地球上选中节点直接移动修改。        在“样式”栏修改线的

  •        主界面,点击绘制按钮,即可进入绘制模式:        绘制模式包括:高级工具、手绘、撤销、重绘、退出绘制、线面切换、保存绘制。        添加节点:点击按钮后,以屏幕十字丝位置添加一个节点;        除添加节点按钮外,也可对地图中任意位置进行点击操作,点击后该位置也会进行添加操作:        撤销:点击后,删除上一个节点,可以连续删除;        重绘:点击后会弹

  • 我正在尝试使用GeoJSON在地图上绘制点。我阅读了文件,其中说明: 可以通过调用数据对象的loadGeoJSON()方法来加载和显示GeoJSON文件 (https://developers.google.com/maps/documentation/javascript/datalayer) 但是,同一页上的示例代码显示: map.data.loadGeoJson(…) 因此,我使用代码示例,

  • [Chrome v32] 未捕获的TypeError:Object[Object Object]没有方法“set stagereference”