// override me public void doZoomIn(Rectangle rbRect) { int x = rbRect.x - mLeft - 5; int y = rbRect.y - mTop - 5; // zoom in double xInc = getXZoomIncrement(); double yInc = getYZoomIncrement(); // get coordinates of new view center // correct the x value if necessary double xx = correctX((double) x); // correct the Y coordinate if necessary double yy = correctY((double) y); double newXCtr = (xx / winXScale) + winXOrigin; double newYCtr = (yy / winYScale) + winYOrigin; // compute the deltas for current range double xDelta = Math.abs(getMaxXVal() - getMinXVal()) / 2.0; double yDelta = Math.abs(getMaxYVal() - getMinYVal()) / 2.0; // compute the aspect ratio of the few double aspect = xDelta / yDelta; // if (aspect > 1.0) // xInc *= aspect; // else // yInc *= aspect; double newXMin = newXCtr < 0 ? newXCtr - xDelta + xInc : newXCtr - xDelta + xInc; double newXMax = newXCtr < 0 ? newXCtr + xDelta - xInc : newXCtr + xDelta - xInc; double newYMin = newYCtr < 0 ? newYCtr - yDelta + yInc : newYCtr - yDelta + yInc; double newYMax = newYCtr < 0 ? newYCtr + yDelta - yInc : newYCtr + yDelta - yInc; double[] oldYs = {getMinYVal(), getMaxYVal()}; double[] newYs = {newYMin, newYMax}; double[] oldXs = {getMinXVal(), getMaxXVal()}; double[] newXs = {newXMin, newXMax}; this.zoomDomain(oldYs, newYs, oldXs, newXs); }