public synchronized void draw(FlipRenderer renderer, GL10 gl) { frontCards.buildTexture(renderer, gl); backCards.buildTexture(renderer, gl); if (!TextureUtils.isValidTexture(frontCards.getTexture()) && !TextureUtils.isValidTexture(backCards.getTexture())) { return; } if (!visible) { return; } switch (state) { case STATE_INIT: case STATE_TOUCH: break; case STATE_AUTO_ROTATE: { animatedFrame++; float delta = (forward ? ACCELERATION : -ACCELERATION) * animatedFrame % 180; float oldAngle = accumulatedAngle; accumulatedAngle += delta; if (oldAngle < 0) { // bouncing back after flip backward and over the first page Assert.assertTrue(forward); if (accumulatedAngle >= 0) { accumulatedAngle = 0; setState(STATE_INIT); } } else { if (frontCards.getIndex() == maxIndex - 1 && oldAngle > frontCards.getIndex() * 180) { // bouncing back after flip forward and over the last page Assert.assertTrue(!forward); if (accumulatedAngle <= frontCards.getIndex() * 180) { setState(STATE_INIT); accumulatedAngle = frontCards.getIndex() * 180; } } else { if (forward) { Assert.assertTrue( "index of backCards should not be -1 when automatically flipping forward", backCards.getIndex() != -1); if (accumulatedAngle >= backCards.getIndex() * 180) { // moved to the next page accumulatedAngle = backCards.getIndex() * 180; setState(STATE_INIT); controller.postFlippedToView(backCards.getIndex()); swapCards(); backCards.resetWithIndex(frontCards.getIndex() + 1); } } else { // backward if (accumulatedAngle <= frontCards.getIndex() * 180) { // firstCards restored accumulatedAngle = frontCards.getIndex() * 180; setState(STATE_INIT); } } } } // ends of `if (oldAngle < 0) {} else {}` if (state == STATE_INIT) { controller.postHideFlipAnimation(); } else { controller.getSurfaceView().requestRender(); } } break; default: AphidLog.e("Invalid state: " + state); break; } float angle = getDisplayAngle(); if (angle < 0) { frontCards.getTopCard().setAxis(Card.AXIS_BOTTOM); frontCards.getTopCard().setAngle(-angle); frontCards.getTopCard().draw(gl); frontCards.getBottomCard().setAngle(0); frontCards.getBottomCard().draw(gl); // no need to draw backCards here } else { if (angle < 90) { // render front view over back view frontCards.getTopCard().setAngle(0); frontCards.getTopCard().draw(gl); backCards.getBottomCard().setAngle(0); backCards.getBottomCard().draw(gl); frontCards.getBottomCard().setAxis(Card.AXIS_TOP); frontCards.getBottomCard().setAngle(angle); frontCards.getBottomCard().draw(gl); } else { // render back view first frontCards.getTopCard().setAngle(0); frontCards.getTopCard().draw(gl); backCards.getTopCard().setAxis(Card.AXIS_BOTTOM); backCards.getTopCard().setAngle(180 - angle); backCards.getTopCard().draw(gl); backCards.getBottomCard().setAngle(0); backCards.getBottomCard().draw(gl); } } if ((frontCards.getView() == null || TextureUtils.isValidTexture(frontCards.getTexture())) && (backCards.getView() == null || TextureUtils.isValidTexture(backCards.getTexture()))) firstDrawFinished = true; }
public synchronized void draw(FlipRenderer renderer, GL10 gl) { applyTexture(renderer, gl); if (!TextureUtils.isValidTexture(frontCards.getTexture()) && !TextureUtils.isValidTexture(backCards.getTexture())) return; if (!visible) return; switch (state) { case STATE_INIT: { /*if (false) { //XXX: debug only if (angle >= 180) forward = false; else if (angle <= 0) forward = true; rotateBy((forward ? TIP_SPEED : -TIP_SPEED)); if (angle > 90 && angle <= 180 - MAX_TIP_ANGLE) { forward = true; } else if (angle < 90 && angle >= MAX_TIP_ANGLE) { forward = false; } }*/ } break; case STATE_TOUCH: break; case STATE_AUTO_ROTATE: { animatedFrame++; rotateBy((forward ? ACCELERATION : -ACCELERATION) * animatedFrame); if (angle >= 180 || angle <= 0) { setState(STATE_INIT); if (angle >= 180) { // flip to next page if (backCards.getIndex() != -1) { activeIndex = backCards.getIndex(); controller.postFlippedToView(activeIndex); } else angle = 180; } controller.postHideFlipAnimation(); } else controller.getSurfaceView().requestRender(); } break; default: AphidLog.e("Invalid state: " + state); break; } if (angle < 90) { // render front view over back view frontCards.getTopCard().setAngle(0); frontCards.getTopCard().draw(gl); backCards.getBottomCard().setAngle(0); backCards.getBottomCard().draw(gl); frontCards.getBottomCard().setAngle(angle); frontCards.getBottomCard().draw(gl); } else { // render back view first frontCards.getTopCard().setAngle(0); frontCards.getTopCard().draw(gl); backCards.getTopCard().setAngle(180 - angle); backCards.getTopCard().draw(gl); backCards.getBottomCard().setAngle(0); backCards.getBottomCard().draw(gl); } }