1 package com.moiseum.wolnelektury.components;
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;
15 import it.sephiroth.android.library.imagezoom.ImageViewTouch;
18 * Created by Piotr Ostrowski on 29.06.2017.
21 public class ZoomableViewPager extends ViewPager {
23 public interface OnItemClickListener {
24 void onItemClick(int position);
27 private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
30 public boolean onSingleTapConfirmed(MotionEvent e) {
31 if (mOnItemClickListener != null) {
32 mOnItemClickListener.onItemClick(getCurrentItem());
38 private OnItemClickListener mOnItemClickListener;
39 private GestureDetector tapGestureDetector;
41 public ZoomableViewPager(Context context) {
46 public ZoomableViewPager(Context context, AttributeSet attrs) {
47 super(context, attrs);
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);
57 return super.canScroll(v, checkV, dx, x, y);
62 * Determines whether the ImageViewTouch can be scrolled.
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.
68 private boolean imageViewTouchCanScroll(ImageViewTouch imageViewTouch, int direction) {
69 int widthScreen = getWidthScreen();
71 RectF bitmapRect = imageViewTouch.getBitmapRect();
72 Rect imageViewRect = new Rect();
73 getGlobalVisibleRect(imageViewRect);
75 int widthBitmapViewTouch = (int) bitmapRect.width();
77 if (widthBitmapViewTouch < widthScreen) {
82 return Math.abs(bitmapRect.right - imageViewRect.right) > 1.0f;
84 return Math.abs(bitmapRect.left - imageViewRect.left) > 1.0f;
89 private int getWidthScreen() {
90 WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
91 Display display = wm.getDefaultDisplay();
93 Point size = new Point();
94 display.getSize(size);
98 private void setup() {
99 tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener());
104 public boolean onInterceptTouchEvent(MotionEvent ev) {
105 tapGestureDetector.onTouchEvent(ev);
106 return super.onInterceptTouchEvent(ev);
109 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
110 mOnItemClickListener = onItemClickListener;