之前画的三角型是无法与用户交互的,为了使交互过程变得更好玩,我们需要监听触摸事件,让图像跟随我们的触摸一起动起来。
首先,我们需要重写触摸事件 onTouchEvent ,并且我们想在触摸发生变化时才进行渲染,所以设置渲染模式为 RENDERMODE_WHEN_DIRTY ,在 onTouchEvent 调用 requestRender 来渲染。
private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private float mPreviousX;
private float mPreviousY;
public MyGlSurfaceView(Context context) {
...
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
float dx = x - mPreviousX;
float dy = y - mPreviousY;
if (y > getHeight() / 2) {
dx = dx * -1;
}
if (x < getWidth() / 2) {
dy = dy * -1;
}
mRenderer.setAngle(
mRenderer.getAngle() +
((dx + dy) * TOUCH_SCALE_FACTOR));
requestRender();
}
mPreviousX = x;
mPreviousY = y;
return true;
}
在opengles中要使图像动起来,这里也要用到矩阵,我们用了 Matrix.setRotateM 方法可以很方便地完成这些操作,得到旋转矩阵后再用它与之前得到的矩阵相乘即可。
private final float[] mRotationMatrix = new float[16];
@Override
public void onDrawFrame(GL10 gl) {
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0, 0, 0, 0, 1.0f, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);
float[] scratch = new float[16];
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
mTriangle.draw(scratch);
}
public float getAngle() {
return mAngle;
}
public void setAngle(float angle) {
mAngle = angle;
}
这样我们的opengles图像就可以跟随着我们的触摸一起动起来了,可以发挥想象做些更好玩的东西,如增加动画之类。