Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / components / ZoomableViewPager.java
diff --git a/Android/app/src/main/java/com/moiseum/wolnelektury/components/ZoomableViewPager.java b/Android/app/src/main/java/com/moiseum/wolnelektury/components/ZoomableViewPager.java
new file mode 100644 (file)
index 0000000..1cfdb52
--- /dev/null
@@ -0,0 +1,113 @@
+package com.moiseum.wolnelektury.components;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.Display;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.WindowManager;
+
+import it.sephiroth.android.library.imagezoom.ImageViewTouch;
+
+/**
+ * Created by Piotr Ostrowski on 29.06.2017.
+ */
+
+public class ZoomableViewPager extends ViewPager {
+
+       public interface OnItemClickListener {
+               void onItemClick(int position);
+       }
+
+       private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
+
+               @Override
+               public boolean onSingleTapConfirmed(MotionEvent e) {
+                       if (mOnItemClickListener != null) {
+                               mOnItemClickListener.onItemClick(getCurrentItem());
+                       }
+                       return true;
+               }
+       }
+
+       private OnItemClickListener mOnItemClickListener;
+       private GestureDetector tapGestureDetector;
+
+       public ZoomableViewPager(Context context) {
+               super(context);
+               setup();
+       }
+
+       public ZoomableViewPager(Context context, AttributeSet attrs) {
+               super(context, attrs);
+               setup();
+       }
+
+       @Override
+       protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+               if (v instanceof ImageViewTouch) {
+                       ImageViewTouch imageViewTouch = (ImageViewTouch) v;
+                       return imageViewTouchCanScroll(imageViewTouch, dx);
+               } else {
+                       return super.canScroll(v, checkV, dx, x, y);
+               }
+       }
+
+       /**
+        * Determines whether the ImageViewTouch can be scrolled.
+        *
+        * @param direction - positive direction value means scroll from right to left,
+        * negative value means scroll from left to right
+        * @return true if there is some more place to scroll, false - otherwise.
+        */
+       private boolean imageViewTouchCanScroll(ImageViewTouch imageViewTouch, int direction) {
+               int widthScreen = getWidthScreen();
+
+               RectF bitmapRect = imageViewTouch.getBitmapRect();
+               Rect imageViewRect = new Rect();
+               getGlobalVisibleRect(imageViewRect);
+
+               int widthBitmapViewTouch = (int) bitmapRect.width();
+
+               if (widthBitmapViewTouch < widthScreen) {
+                       return false;
+               }
+
+               if (direction < 0) {
+                       return Math.abs(bitmapRect.right - imageViewRect.right) > 1.0f;
+               } else {
+                       return Math.abs(bitmapRect.left - imageViewRect.left) > 1.0f;
+               }
+
+       }
+
+       private int getWidthScreen() {
+               WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+               Display display = wm.getDefaultDisplay();
+
+               Point size = new Point();
+               display.getSize(size);
+               return size.x;
+       }
+
+       private void setup() {
+               tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener());
+       }
+
+
+       @Override
+       public boolean onInterceptTouchEvent(MotionEvent ev) {
+               tapGestureDetector.onTouchEvent(ev);
+               return super.onInterceptTouchEvent(ev);
+       }
+
+       public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+               mOnItemClickListener = onItemClickListener;
+       }
+
+}