Android 使用OnTouchListener重新绘制GLrendered正方形?
我的程序是当触摸屏幕时,出现一个白色的正方形并在z轴上移动 我的目标和问题是,当屏幕被反复触摸时,我也希望这种情况再次发生 由于某种原因,添加invalidate();在正方形之后,画图不起作用。我还尝试在activity类中创建一个线程来锁定和解锁画布。我不太确定我在做什么,如果有人能给我指出正确的方向那就太好了 这是我的活动类中的GLRendering类Android 使用OnTouchListener重新绘制GLrendered正方形?,android,opengl-es-2.0,ontouchlistener,Android,Opengl Es 2.0,Ontouchlistener,我的程序是当触摸屏幕时,出现一个白色的正方形并在z轴上移动 我的目标和问题是,当屏幕被反复触摸时,我也希望这种情况再次发生 由于某种原因,添加invalidate();在正方形之后,画图不起作用。我还尝试在activity类中创建一个线程来锁定和解锁画布。我不太确定我在做什么,如果有人能给我指出正确的方向那就太好了 这是我的活动类中的GLRendering类 public class GL1Activity extends Activity implements OnTouchListener
public class GL1Activity extends Activity implements OnTouchListener {
GLSurfaceView ourSurface;
float x,y;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
ourSurface = new GLSurfaceView(this);
ourSurface.setOnTouchListener(this);
x=0;
y=0;
ourSurface.setRenderer(new GL1Renderer()); //links to GL1Renderer
setContentView(ourSurface);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ourSurface.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
ourSurface.onResume();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
x = event.getX();
y = event.getY();
return false;
}
public class GL1Renderer implements Renderer {
private GL1Square square;
float zoomz;
public GL1Renderer (){
square = new GL1Square();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig eglconfig) {
// TODO Auto-generated method stub
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(.1f, .1f, .1f, 1); //painting background
gl.glClearDepthf(1f);
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 3, 0);
if (x != 0 && y != 0){
gl.glTranslatef(0, 0, zoomz);
if (zoomz < 50) {
zoomz-=.1;
}
if (zoomz > 50){
zoomz = 0;
}
square.draw(gl);
};
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
gl.glViewport(0, 0, width, height);
float ratio = (float) width/height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
}
}
关于可能尝试从活动类调用onDrawFrame()。。。? 从我的理解来看,这将很好地重新绘制框架
public class GL1Square {
private float vertices[] = {
-1.0f, 1.0f,
1.0f, 1.0f,
1.0f, -1.0f,
-1.0f, -1.0f,
};
private short[] pIndex = { 0, 1, 2, 0, 2, 3};
private ShortBuffer pBuff;
private FloatBuffer vertBuff;
public GL1Square(){
ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
bBuff.order(ByteOrder.nativeOrder());
vertBuff = bBuff.asFloatBuffer();
vertBuff.put(vertices);
vertBuff.position(0);
ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
pbBuff.order(ByteOrder.nativeOrder());
pBuff = pbBuff.asShortBuffer();
pBuff.put(pIndex);
pBuff.position(0);
}
public void draw(GL10 gl){
gl.glFrontFace(GL10.GL_CW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_FRONT);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertBuff);
gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
}