public class Vortex extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(new VortexView(this)); } } public class VortexView extends GLSurfaceView{ VortexRtender mRender; float mX; float mY; public VortexView(Context context) { super(context); mRender=new VortexRtender(); setRenderer(mRender); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:{ mX=event.getX(); mY=event.getY(); } break; case MotionEvent.ACTION_MOVE:{ final float xdiff=mX-event.getX(); final float ydiff=mY-event.getY(); queueEvent(new Runnable() { @Override public void run() { mRender.setmXAngle(mRender.getmXAngle()+ydiff); mRender.setmYAngle(mRender.getmYAngle()+xdiff); } }); mX=event.getX(); mY=event.getY(); } break; default: break; } //return super.onTouchEvent(event); return true; } } public class VortexRtender implements GLSurfaceView.Renderer { private ShortBuffer mIndexBuffer; private FloatBuffer mVertexBuffer; private FloatBuffer mColorBuffer; private int mNumOfVertices; private float mXAngle; private float mYAngle; public float getmXAngle() { return mXAngle; } public void setmXAngle(float mXAngle) { this.mXAngle = mXAngle; } public float getmYAngle() { return mYAngle; } public void setmYAngle(float mYAngle) { this.mYAngle = mYAngle; } @Override public void onDrawFrame(GL10 gl) { gl.glClearColor(0f, 0f, 0f, 1f); gl.glLoadIdentity(); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glRotatef(mXAngle, 1f, 0f, 0f); gl.glRotatef(mYAngle, 0f, 1f, 0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer); gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer); gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfVertices, GL10.GL_UNSIGNED_SHORT, mIndexBuffer); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glEnable(GL10.GL_CULL_FACE); gl.glFrontFace(GL10.GL_CCW); gl.glCullFace(GL10.GL_BACK); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); initTriangle(); } private void initTriangle() { float[] coords = { -0.5f, -0.5f, 0.5f, // 0 0.5f, -0.5f, 0.5f, // 1 0f, -0.5f, -0.5f, // 2 0f, 0.5f, 0f, // 3 }; mNumOfVertices=coords.length; float[] colors={ 1f,0f,0f,1f,//pointer 0 red 0f,1f,0f,1f,//pointer 1 green 0f,0f,1f,1f,//pointer 2 blue 1f,1f,1f,1f,//pointer 3 white }; short[] indices=new short[]{ 0, 1, 3, // rwg 0, 2, 1, // rbg 0, 3, 2, // rbw 1, 2, 3, // bwg }; ByteBuffer vbb=ByteBuffer.allocateDirect(coords.length*4); vbb.order(ByteOrder.nativeOrder()); mVertexBuffer=vbb.asFloatBuffer(); ByteBuffer ibb=ByteBuffer.allocateDirect(indices.length*2); ibb.order(ByteOrder.nativeOrder()); mIndexBuffer=ibb.asShortBuffer(); ByteBuffer cbb=ByteBuffer.allocateDirect(colors.length*4); cbb.order(ByteOrder.nativeOrder()); mColorBuffer=cbb.asFloatBuffer(); mVertexBuffer.put(coords); mIndexBuffer.put(indices); mColorBuffer.put(colors); mVertexBuffer.position(0); mIndexBuffer.position(0); mColorBuffer.position(0); } } 效果图: 这中间遇到一个问题在: @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:{ mX=event.getX(); mY=event.getY(); } break; case MotionEvent.ACTION_MOVE:{ final float xdiff=mX-event.getX(); final float ydiff=mY-event.getY(); queueEvent(new Runnable() { @Override public void run() { mRender.setmXAngle(mRender.getmXAngle()+ydiff); mRender.setmYAngle(mRender.getmYAngle()+xdiff); } }); mX=event.getX(); mY=event.getY(); } break; default: break; } //return super.onTouchEvent(event); return true; } //return super.onTouchEvent(event); return true; 结果一直没有处理MotionEvent.ACTION_MOVE这个事件,然后返回return true;就可以了。也就是自己处理,不让系统处理了。