If you think the Android project customhellochartdemo listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
Java Source Code
package lecho.lib.hellocharts.gesture;
//www.java2s.comimport lecho.lib.hellocharts.ChartComputator;
import lecho.lib.hellocharts.model.Viewport;
import android.content.Context;
import android.graphics.PointF;
import android.view.MotionEvent;
/**
* Encapsulates zooming functionality.
*
*/publicclass ChartZoomer {
publicstaticfinalfloat ZOOM_AMOUNT = 0.25f;
private ZoomerCompat zoomer;
private ZoomType zoomType;
private PointF zoomFocalPoint = new PointF();// Used for double tap zoom
private PointF viewportFocus = new PointF();
private Viewport scrollerStartViewport = new Viewport(); // Used only for zooms and flings
public ChartZoomer(Context context, ZoomType zoomType) {
zoomer = new ZoomerCompat(context);
this.zoomType = zoomType;
}
publicboolean startZoom(MotionEvent e, ChartComputator computator) {
zoomer.forceFinished(true);
scrollerStartViewport.set(computator.getCurrentViewport());
if (!computator.rawPixelsToDataPoint(e.getX(), e.getY(), zoomFocalPoint)) {
// Focus point is not within content area.
return false;
}
zoomer.startZoom(ZOOM_AMOUNT);
return true;
}
publicboolean computeZoom(ChartComputator computator) {
if (zoomer.computeZoom()) {
// Performs the zoom since a zoom is in progress (either programmatically or via
// double-touch).
finalfloat newWidth = (1.0f - zoomer.getCurrZoom()) * scrollerStartViewport.width();
finalfloat newHeight = (1.0f - zoomer.getCurrZoom()) * scrollerStartViewport.height();
finalfloat pointWithinViewportX = (zoomFocalPoint.x - scrollerStartViewport.left)
/ scrollerStartViewport.width();
finalfloat pointWithinViewportY = (zoomFocalPoint.y - scrollerStartViewport.bottom)
/ scrollerStartViewport.height();
float left = zoomFocalPoint.x - newWidth * pointWithinViewportX;
float top = zoomFocalPoint.y + newHeight * (1 - pointWithinViewportY);
float right = zoomFocalPoint.x + newWidth * (1 - pointWithinViewportX);
float bottom = zoomFocalPoint.y - newHeight * pointWithinViewportY;
setCurrentViewport(computator, left, top, right, bottom);
return true;
}
return false;
}
publicboolean scale(ChartComputator computator, float focusX, float focusY, float scale) {
/**
* Smaller viewport means bigger zoom so for zoomIn scale should have value <1, for zoomOout >1
*/finalfloat newWidth = scale * computator.getCurrentViewport().width();
finalfloat newHeight = scale * computator.getCurrentViewport().height();
if (!computator.rawPixelsToDataPoint(focusX, focusY, viewportFocus)) {
// Focus point is not within content area.
return false;
}
float left = viewportFocus.x - (focusX - computator.getContentRect().left)
* (newWidth / computator.getContentRect().width());
float top = viewportFocus.y + (focusY - computator.getContentRect().top)
* (newHeight / computator.getContentRect().height());
float right = left + newWidth;
float bottom = top - newHeight;
setCurrentViewport(computator, left, top, right, bottom);
return true;
}
privatevoid setCurrentViewport(ChartComputator computator, float left, float top, float right, float bottom) {
Viewport currentViewport = computator.getCurrentViewport();
if (ZoomType.HORIZONTAL_AND_VERTICAL == zoomType) {
computator.setCurrentViewport(left, top, right, bottom);
} elseif (ZoomType.HORIZONTAL == zoomType) {
computator.setCurrentViewport(left, currentViewport.top, right, currentViewport.bottom);
} elseif (ZoomType.VERTICAL == zoomType) {
computator.setCurrentViewport(currentViewport.left, top, currentViewport.right, bottom);
}
}
public ZoomType getZoomType() {
return zoomType;
}
publicvoid setZoomType(ZoomType zoomType) {
this.zoomType = zoomType;
}
}