首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android OpenGL传递OnTouch事件值

问Android OpenGL传递OnTouch事件值
EN

Stack Overflow用户
提问于 2015-09-17 08:31:22
回答 1查看 261关注 0票数 1

我有麻烦了。我不知道如何将OnTouch方法中的值x和y传递给私有的最终类MyRenderer,并更新OnDrawFrame tex.draw(、x、y、)函数x和y值,以便能够转换我想用手指移动的对象。

如有任何指导,请注意~

代码语言:javascript
复制
public class Stage extends GLSurfaceView{

// Stage width and height
private float w, h;

// Screen width and height
private int screenWidth, screenHeight;

// Our native vertex buffer
private FloatBuffer vertexBuffer;

private Texture tex;

@Override
public boolean onTouchEvent(MotionEvent event) {
    final int action = event.getAction() & MotionEvent.ACTION_MASK;
    float x, y;
    int pointerIndex;
    int pointerId;

    if (action == MotionEvent.ACTION_DOWN) {
        pointerId = event.getPointerId(0);
        x = event.getX();
        y = event.getY();
        pointerIndex = 0;
    } else {
        pointerIndex = event.getActionIndex();
        pointerId = event.getPointerId(pointerIndex);
        x = event.getX(pointerIndex);
        y = event.getY(pointerIndex);
    }
    Log.v("this X", String.valueOf(x));
    Log.v("this Y", String.valueOf(y));

    return true;
}

public Stage(Context context, AttributeSet attrs) {
    super(context, attrs);
    setEGLConfigChooser(8, 8, 8, 8, 0, 0);
    setRenderer(new MyRenderer());
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    float vertices[] = {
            -0.5f, -0.5f,  0.0f,  // 0. left-bottom
            0.5f, -0.5f,  0.0f,  // 1. right-bottom
            -0.5f,  0.5f,  0.0f,  // 2. left-top
            0.5f,  0.5f,  0.0f   // 3. right-top
    };

    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    tex = new Texture(R.drawable.kdk);

}

private final class MyRenderer implements GLSurfaceView.Renderer {

    public final void onDrawFrame(GL10 gl) {

        gl.glClear(GLES10.GL_COLOR_BUFFER_BIT);
        gl.glLoadIdentity();
        tex.prepare(gl, GL10.GL_CLAMP_TO_EDGE);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        tex.draw(gl, w / 2, h / 2, tex.getWidth(), tex.getHeight(), 0);

    }

    public final void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glClearColor(0, 0, 0, 0);

        if(width > height) {
            h = 600;
            w = width * h / height;
        } else {
            w = 600;
            h = height * w / width;
        }
        screenWidth = width;
        screenHeight = height;

        gl.glViewport(0, 0, screenWidth, screenHeight);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(0, w, h, 0, -1, 1);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public final void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Set up alpha blending
        gl.glEnable(GL10.GL_ALPHA_TEST);
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

        // We are in 2D. Why needs depth?
        gl.glDisable(GL10.GL_DEPTH_TEST);

        // Enable vertex arrays (we'll use them to draw primitives).
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

        // Enable texture coordination arrays.
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        tex.load(getContext());
    }

}

}

其他编码

How to apply drag drop and scale in Android OpenGL ES

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-17 08:52:57

要实现这一点,您必须将MyRenderer属性添加到Stage类中。

这一解决方案将有效,但它可能不是最好的,所以可以自由评论。

  1. 您需要更改内部类MyRenderer的定义,方法是删除final语句: 编辑:我对此并不确定,因为final class将将其所有方法设置为最终,但可能不会设置属性。如果有人能回答的话,我很乐意去读它。 私有最终类MyRenderer实现GLSurfaceView.Renderer

至

私有类MyRenderer实现GLSurfaceView.Renderer

  1. 在您的阶段类中: 公共类级扩展GLSurfaceView { //工作台宽度和高度私有浮动w,h;. //呈现器MyRenderer mRenderer;.公共舞台(上下文,AttributeSet吸引){ mRenderer =新MyRenderer();超级(上下文,吸引);setEGLConfigChooser(8,8,8,8,0,0,0);setRenderer(mRenderer);.}
  2. 将设置器添加到MyRenderer类中: 私有类MyRenderer实现GLSurfaceView.Renderer { xPos;float yPos;// .公共空setX(浮x) { xPos = x;}公共空setY(浮y) { yPos = y;}公共空setXY(浮x,浮y) { xPos = x;yPos = y;}
  3. 最后,在OnTouch方法中设置这些值。

编辑:

若要设置xPos和yPos默认值,请执行以下操作:

代码语言:javascript
复制
private class MyRenderer implements GLSurfaceView.Renderer {

    float xPos;
    float yPos;

    boolean initialised = false;

    ...

    public final void onSurfaceChanged(GL10 gl, int width, int height) {

        if (!initialised) {
            xPos = width /2;
            yPos = height / 2;
            initialised = true;
        }

        ...
    }

    ...
}

编辑2:

为了避免竞争条件,用一个函数同时设置X和Y值。当输入该方法时,它将使用传入参数的值创建临时变量。这将确保传递的x和y值来自同一个事件。

代码语言:javascript
复制
private class MyRenderer implements GLSurfaceView.Renderer {

    float xPos;
    float yPos;

    // ...


    public void setXY(float x, float y) {
        xPos = x;
        yPos = y;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32625793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档