Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / components / ZoomableViewPager.java
1 package com.moiseum.wolnelektury.components;
2
3 import android.content.Context;
4 import android.graphics.Point;
5 import android.graphics.Rect;
6 import android.graphics.RectF;
7 import android.support.v4.view.ViewPager;
8 import android.util.AttributeSet;
9 import android.view.Display;
10 import android.view.GestureDetector;
11 import android.view.MotionEvent;
12 import android.view.View;
13 import android.view.WindowManager;
14
15 import it.sephiroth.android.library.imagezoom.ImageViewTouch;
16
17 /**
18  * Created by Piotr Ostrowski on 29.06.2017.
19  */
20
21 public class ZoomableViewPager extends ViewPager {
22
23         public interface OnItemClickListener {
24                 void onItemClick(int position);
25         }
26
27         private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
28
29                 @Override
30                 public boolean onSingleTapConfirmed(MotionEvent e) {
31                         if (mOnItemClickListener != null) {
32                                 mOnItemClickListener.onItemClick(getCurrentItem());
33                         }
34                         return true;
35                 }
36         }
37
38         private OnItemClickListener mOnItemClickListener;
39         private GestureDetector tapGestureDetector;
40
41         public ZoomableViewPager(Context context) {
42                 super(context);
43                 setup();
44         }
45
46         public ZoomableViewPager(Context context, AttributeSet attrs) {
47                 super(context, attrs);
48                 setup();
49         }
50
51         @Override
52         protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
53                 if (v instanceof ImageViewTouch) {
54                         ImageViewTouch imageViewTouch = (ImageViewTouch) v;
55                         return imageViewTouchCanScroll(imageViewTouch, dx);
56                 } else {
57                         return super.canScroll(v, checkV, dx, x, y);
58                 }
59         }
60
61         /**
62          * Determines whether the ImageViewTouch can be scrolled.
63          *
64          * @param direction - positive direction value means scroll from right to left,
65          * negative value means scroll from left to right
66          * @return true if there is some more place to scroll, false - otherwise.
67          */
68         private boolean imageViewTouchCanScroll(ImageViewTouch imageViewTouch, int direction) {
69                 int widthScreen = getWidthScreen();
70
71                 RectF bitmapRect = imageViewTouch.getBitmapRect();
72                 Rect imageViewRect = new Rect();
73                 getGlobalVisibleRect(imageViewRect);
74
75                 int widthBitmapViewTouch = (int) bitmapRect.width();
76
77                 if (widthBitmapViewTouch < widthScreen) {
78                         return false;
79                 }
80
81                 if (direction < 0) {
82                         return Math.abs(bitmapRect.right - imageViewRect.right) > 1.0f;
83                 } else {
84                         return Math.abs(bitmapRect.left - imageViewRect.left) > 1.0f;
85                 }
86
87         }
88
89         private int getWidthScreen() {
90                 WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
91                 Display display = wm.getDefaultDisplay();
92
93                 Point size = new Point();
94                 display.getSize(size);
95                 return size.x;
96         }
97
98         private void setup() {
99                 tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener());
100         }
101
102
103         @Override
104         public boolean onInterceptTouchEvent(MotionEvent ev) {
105                 tapGestureDetector.onTouchEvent(ev);
106                 return super.onInterceptTouchEvent(ev);
107         }
108
109         public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
110                 mOnItemClickListener = onItemClickListener;
111         }
112
113 }