Original address: http://android.xsoftlab.net/training/graphics/opengl/touch.html
Making the graph rotate according to the program design is still not able to play its rightful part in OpenGL. But if the user can directly control the rotation of the graph, this is the true purpose of OpenGL. The real key is to enable the program to touch interactively. This is mainly by rewriting Glsurfaceview's Ontouchevent () method to achieve touch event monitoring.
This lesson will show you how to listen for touch events to enable the user to rotate the graphic.
Setting up a touch listener
To enable OpenGL to listen for touch events, you must override the Ontouchevent () method in the Glsurfaceview class. The following implementation shows how to listen for the Motionevent.action_move event and how to make the event drive the rotation of the graph.
Private Final floatTouch_scale_factor =180.0F/ the;Private floatMpreviousx;Private floatMpreviousy;@Override Public Boolean ontouchevent(Motionevent e) {//motionevent reports input details from the touch screen //and other input controls. In this case, you is only //Interested in events where the touch position changed. floatx = E.getx ();floaty = e.gety ();Switch(E.getaction ()) { CaseMotionevent.action_move:floatDX = X-mpreviousx;floatdy = y-mpreviousy;//reverse direction of rotation above the mid-line if(Y > GetHeight ()/2) {dx = DX *-1; }//reverse direction of rotation to left of the mid-line if(x < getwidth ()/2) {dy = dy *-1; } mrenderer.setangle (Mrenderer.getangle () + (dx + dy) * TOUCH_SCALE_FAC TOR)); Requestrender (); } mpreviousx = x; Mpreviousy = y;return true;}
It is important to note that after calculating the rotation angle, this method calls the Requestrender () method, which notifies the renderer that it can render. This method is best suited for this place because the frame does not need to be redrawn until it has changed in perspective. In any case, this approach does not have any effect on efficiency unless you also set a request to redraw when the data changes. This request is set by the Setrendermode () method, so make sure that the following line of code is not commented:
publicMyGLSurfaceView(Context context) { ... // Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);}
Exposure rotation angle
The example code in the
above would require an exposed member method to expose the angle of rotation. Once the render code is running in a child thread, the public member must be declared volatile. The following code declares the volatile property and exposes its Get,set method:
publicclass MyGLRenderer implements GLSurfaceView.Renderer { ... publicvolatilefloat mAngle; publicfloatgetAngle() { return mAngle; } publicvoidsetAngle(float angle) { mAngle = angle; }}
Request rotation
To touch event-driven rotation, you need to annotate the code that generates the angle, and then add the Mangle member property, which contains the angle generated by the touch event mangle:
Public void Ondrawframe(GL10 GL) { ...float[] Scratch =New float[ -];//Create a rotation for the triangle //long time = Systemclock.uptimemillis ()% 4000L; //Float angle = 0.090f * ((int) time);Matrix.setrotatem (Mrotationmatrix,0, MAngle,0,0, -1.0f);//Combine the rotation matrix with the projection and camera view //Note that the Mmvpmatrix factor *must is first* in order //For the matrix multiplication product to be correct.Matrix.multiplymm (Scratch,0, Mmvpmatrix,0, Mrotationmatrix,0);//Draw triangleMtriangle.draw (scratch);}
If you have completed the steps described above, start the program and then drag on the screen to rotate the triangle:
Android Official Development Document Training Series Course Chinese version: OpenGL Drawing Response Touch Event