/** * Copyright (C) 2009 Michael A. MacDonald */ package android.androidVNC; import com.cgcl.cloudesk.cloudeskmain.screens.act.R; import android.graphics.Matrix; import android.util.Log; import android.widget.ImageView.ScaleType; /** * @author Michael A. MacDonald */ class ZoomScaling extends AbstractScaling { static final String TAG = "ZoomScaling"; private Matrix matrix; int canvasXOffset; int canvasYOffset; float scaling; float minimumScale; /** * @param id * @param scaleType */ public ZoomScaling() { super(R.id.itemZoomable, ScaleType.MATRIX); matrix = new Matrix(); scaling = 1; } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#getDefaultHandlerId() */ @Override int getDefaultHandlerId() { //return R.id.itemInputTouchPanZoomMouse; return R.id.itemInputMouse; } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#isAbleToPan() */ @Override boolean isAbleToPan() { return true; } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#isValidInputMode(int) */ @Override boolean isValidInputMode(int mode) { return mode != R.id.itemInputFitToScreen; } /** * Call after scaling and matrix have been changed to resolve scrolling * @param activity */ private void resolveZoom(VncCanvasActivity activity) { activity.vncCanvas.scrollToAbsolute(); activity.vncCanvas.pan(0,0); } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#zoomIn(android.androidVNC.VncCanvasActivity) */ @Override void zoomIn(VncCanvasActivity activity) { resetMatrix(); standardizeScaling(); scaling += 0.25; if (scaling > 4.0) { scaling = (float)4.0; activity.zoomer.setIsZoomInEnabled(false); } activity.zoomer.setIsZoomOutEnabled(true); matrix.postScale(scaling, scaling); //Log.v(TAG,String.format("before set matrix scrollx = %d scrolly = %d", activity.vncCanvas.getScrollX(), activity.vncCanvas.getScrollY())); activity.vncCanvas.setImageMatrix(matrix); resolveZoom(activity); } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#getScale() */ @Override float getScale() { return scaling; } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#zoomOut(android.androidVNC.VncCanvasActivity) */ @Override void zoomOut(VncCanvasActivity activity) { resetMatrix(); standardizeScaling(); scaling -= 0.25; if (scaling < minimumScale) { scaling = minimumScale; activity.zoomer.setIsZoomOutEnabled(false); } activity.zoomer.setIsZoomInEnabled(true); matrix.postScale(scaling, scaling); //Log.v(TAG,String.format("before set matrix scrollx = %d scrolly = %d", activity.vncCanvas.getScrollX(), activity.vncCanvas.getScrollY())); activity.vncCanvas.setImageMatrix(matrix); //Log.v(TAG,String.format("after set matrix scrollx = %d scrolly = %d", activity.vncCanvas.getScrollX(), activity.vncCanvas.getScrollY())); resolveZoom(activity); } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#adjust(android.androidVNC.VncCanvasActivity, float, float, float) */ @Override void adjust(VncCanvasActivity activity, float scaleFactor, float fx, float fy) { float newScale = scaleFactor * scaling; if (scaleFactor < 1) { if (newScale < minimumScale) { newScale = minimumScale; activity.zoomer.setIsZoomOutEnabled(false); } activity.zoomer.setIsZoomInEnabled(true); } else { if (newScale > 4) { newScale = 4; activity.zoomer.setIsZoomInEnabled(false); } activity.zoomer.setIsZoomOutEnabled(true); } // ax is the absolute x of the focus int xPan = activity.vncCanvas.absoluteXPosition; float ax = (fx / scaling) + xPan; float newXPan = (scaling * xPan - scaling * ax + newScale * ax)/newScale; int yPan = activity.vncCanvas.absoluteYPosition; float ay = (fy / scaling) + yPan; float newYPan = (scaling * yPan - scaling * ay + newScale * ay)/newScale; resetMatrix(); scaling = newScale; matrix.postScale(scaling, scaling); activity.vncCanvas.setImageMatrix(matrix); resolveZoom(activity); activity.vncCanvas.pan((int)(newXPan - xPan), (int)(newYPan - yPan)); } private void resetMatrix() { matrix.reset(); matrix.preTranslate(canvasXOffset, canvasYOffset); } /** * Set scaling to one of the clicks on the zoom scale */ private void standardizeScaling() { scaling = ((float)((int)(scaling * 4))) / 4; } /* (non-Javadoc) * @see android.androidVNC.AbstractScaling#setScaleTypeForActivity(android.androidVNC.VncCanvasActivity) */ @Override void setScaleTypeForActivity(VncCanvasActivity activity) { super.setScaleTypeForActivity(activity); scaling = (float)1.0; minimumScale = activity.vncCanvas.bitmapData.getMinimumScale(); canvasXOffset = -activity.vncCanvas.getCenteredXOffset(); canvasYOffset = -activity.vncCanvas.getCenteredYOffset(); resetMatrix(); activity.vncCanvas.setImageMatrix(matrix); // Reset the pan position to (0,0) resolveZoom(activity); } }