2010-11-17 67 views
2

即使对于常规视图,手册也很模糊,甚至没有在UI事件概述页面中提到mGLSurfaceView。使用mGLSurfaceView处理UI事件

对于初学者来说,所有示例都不起作用,因为它们依赖于视图的Id(例如Button button = (Button)findViewById(R.id.corky);)。我尝试来回发送UI事件的时间很糟糕。我使用了霰弹枪解决方案,并将mGLSurfaceView的每个输入事件附加到活动中......但我渴望更好的东西。

所以,任何有足够勇气的人都可以用一个活动,一个mGLSurfaceView和一个活动onTouch事件说出一个简单的例子,说明相对于屏幕大小的点击在哪里? (如W = 50%,H = 50%,在屏幕的中心,地理位置点击)


public class GlClick extends Activity implements OnTouchListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 
     mGLSurfaceView = new GLSurfaceView(this); 
     mGLSurfaceView.setRenderer(new GlRenderer()); 
     setContentView(mGLSurfaceView); 
     mGLSurfaceView.setOnTouchListener(this); 
    } 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.d(TAG, "example output: click was on 234x211 for a 800x600 screen.") 
    } 
} 

class GlRenderer implements Renderer { 
    // here be lots of messy beginner GL code ... 
    // ... you'd have wished for dragons. 
    public void onSurfaceChanged(GL10 gl, int w, int h) { 
     screenWidth = w; 
     screenHeight = h; 
     //TODO: send that to the activity 
    } 
} 

回答

1

我工作的一个应用程序OGL在Android

我不使用任何触摸监听器或任何预先制作的,因为迟早你会失去尝试弄清楚如何做一些事情lol

我发现我们工作我们我简直就是

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if(sr != null){ 
      /*if(event.getAction() == MotionEvent.ACTION_DOWN){ 
      }else if(event.getAction() == MotionEvent.ACTION_MOVE){ 
      }else if(event.getAction() == MotionEvent.ACTION_CANCEL){ 
      }else if(event.getAction() == MotionEvent.ACTION_UP){*/ 
      GameHandler.onTouchEvent(event); 
      //} 
     } 
     return true; 
    } 

和在GameHandler中我首先将触摸从屏幕坐标转换为glworld坐标。

在我的UI元素

我的位置和大小,并添加我的方法“触摸(...)”或“isTouched()”

通过我的经验,这个工作得很好,我建议你试试吧^^

编辑触摸皈依

public static void convertTouchToWorldRef(Vect vect){ 
     vect.y = (SceneRenderer.Height-vect.y)/SceneRenderer.Height*SceneRenderer.GAME_DIMENSION_H; 
     vect.x = (vect.x)/SceneRenderer.Width*SceneRenderer.GAME_DIMENSION_W; 
    } 
; 

你需要在y做高度-Y(OGL和Android有起源的不同位置)

GAME_DIMENSION _ *是ogl世界投影平面的尺寸(800 * 600)。

然后它的基本数学(我不记得英文名称),但它的公式x1/X1 = x2/X2。

编辑:矢量

public class Vector{ 
private float x = 0; 
private float y = 0; 
public Vector(float x, float y){ 
    this.x = x; 
    this.y = y; 
} 
//add accessors get/set 
... 
} 

您可以浏览互联网的诸如http://www.gamedev.net/community/forums/topic.asp?topic_id=302771

+0

更好的例子可能大家分享你如何“转换触摸从屏幕坐标到glworld坐标”? – gcb 2010-11-17 09:07:58

+0

嗯,我的公式有点太复杂(我的触摸在我的glworld中不成比例),但是我用类似的东西编辑了我的代码。 – 2010-11-17 09:11:07

+0

感谢您的更新。但是,Vect是什么?在文档中找不到它。 – gcb 2010-11-20 02:19:43