I have an app: 3D Cube (OPENGLES) with touch and key support. I'm using KEYCODE_VOLUME_UP/DOWN to zoom in/out. Method responsible for that is placed in: MyGLSurfaceView extends GLSurfaceView. My problem is, when I press the zoom out/int, it works fine, but I have also volume up/down function. Is possible quick solution for that?
code:
@Override
public boolean onKeyUp(int keyCode, KeyEvent evt) {
switch(keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT: // Decrease Y-rotational speed
renderer.speedY -= 0.3f;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT: // Increase Y-rotational speed
renderer.speedY += 0.3f;
break;
case KeyEvent.KEYCODE_DPAD_UP: // Decrease X-rotational speed
renderer.speedX -= 0.3f;
break;
case KeyEvent.KEYCODE_DPAD_DOWN: // Increase X-rotational speed
renderer.speedX += 0.3f;
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:// Zoom out (decrease z)
renderer.z -= 0.4f;
break;
case KeyEvent.KEYCODE_VOLUME_UP: // Zoom in (increase z)
renderer.z += 0.4f;
break;
case KeyEvent.KEYCODE_DPAD_CENTER:
renderer.speedY = 0;
renderer.speedX = 0;
renderer.z = -6.0f;
break;
}
return true;
}
The system volume control is performed by the onKeyDown event. Returning true in your class cancels the onKeyUp event from being processed by the system but the onKeyDown has already been run. Override onKeyDown instead and it should work.
EDIT: After some research it seems that the best approach to override dispatchKeyEvent which should prevent both the onKeyDown and onKeyUp events.