diff options
-rw-r--r-- | android/experimental/desktop/src/org/libreoffice/experimental/desktop/Desktop.java | 42 | ||||
-rw-r--r-- | vcl/android/androidinst.cxx | 16 |
2 files changed, 56 insertions, 2 deletions
diff --git a/android/experimental/desktop/src/org/libreoffice/experimental/desktop/Desktop.java b/android/experimental/desktop/src/org/libreoffice/experimental/desktop/Desktop.java index d4ded73ede61..7664bf88e715 100644 --- a/android/experimental/desktop/src/org/libreoffice/experimental/desktop/Desktop.java +++ b/android/experimental/desktop/src/org/libreoffice/experimental/desktop/Desktop.java @@ -50,6 +50,7 @@ public class Desktop public static native void setViewSize(int width, int height); public static native void key(char c, short timestamp); public static native void touch(int action, int x, int y, short timestamp); + public static native void zoom(float scale, int x, int y); /** * This class contains the state that is initialized once and never changes @@ -162,19 +163,55 @@ public class Desktop Bitmap mBitmap; boolean renderedOnce; ScaleGestureDetector gestureDetector; + float scale = 1; public BitmapView() { super(Desktop.this); setFocusableInTouchMode(true); + + // While a scale gesture (two-finger pinch / spread to + // zoom out / in) is in progress we just scale the bitmap + // view (UI elements too, which of course is a bit silly). + // When the scale gesture has finished, we ask LO to zoom + // the document (and reset the view scale, it will be + // replaced by one where the document (not UI elements) is + // displayed at a different zoom level). + + // Is that sane? Would it be too slow to ask LO to zoom + // continuously while the gesture is in progress? + gestureDetector = new ScaleGestureDetector(Desktop.this, new ScaleGestureDetector.SimpleOnScaleGestureListener() { + @Override public boolean onScaleBegin(ScaleGestureDetector detector) + { + Log.i(TAG, "onScaleBegin: pivot=(" + detector.getFocusX() + ", " + detector.getFocusY() + ")"); + setPivotX(detector.getFocusX()); + setPivotY(detector.getFocusY()); + return true; + } + @Override public boolean onScale(ScaleGestureDetector detector) { - Log.i(TAG, "onScale: " + detector.getScaleFactor()); + float s = detector.getScaleFactor(); + if (s > 0.95 && s < 1.05) + return false; + scale *= s; + Log.i(TAG, "onScale: " + s + " => " + scale); + setScaleX(scale); + setScaleY(scale); return true; } + + @Override public void onScaleEnd(ScaleGestureDetector detector) + { + Log.i(TAG, "onScaleEnd: " + scale); + Desktop.zoom(scale, (int) detector.getFocusX(), (int) detector.getFocusY()); + scale = 1; + setScaleX(scale); + setScaleY(scale); + } }); } @@ -226,7 +263,8 @@ public class Desktop @Override public boolean onTouchEvent(MotionEvent event) { - gestureDetector.onTouchEvent(event); + if (gestureDetector.onTouchEvent(event)) + return true; if (!renderedOnce) return super.onTouchEvent(event); diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx index 2c54a0eeeff3..46e6588b2482 100644 --- a/vcl/android/androidinst.cxx +++ b/vcl/android/androidinst.cxx @@ -971,4 +971,20 @@ Java_org_libreoffice_experimental_desktop_Desktop_touch(JNIEnv * /* env */, LOGW("No focused frame to emit event on"); } +// public static native void zoom(float scale, int x, int y); +extern "C" SAL_JNI_EXPORT void JNICALL +Java_org_libreoffice_experimental_desktop_Desktop_zoom(JNIEnv * /* env */, + jobject /* clazz */, + jfloat scale, + jint x, + jint y) +{ + (void) x; + (void) y; + + if (scale > 1.05) { + } else if (scale < 0.95) { + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |