package com.todayinfo.ui.component.gesture; import android.graphics.RectF; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.ImageView; /** * Provided default implementation of GestureDetector.OnDoubleTapListener, to be overriden with custom behavior, if needed * <p> </p> * To be used via {@link uk.co.senab.photoview.PhotoViewAttacher#setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener)} */ public class DefaultOnDoubleTapListener implements GestureDetector.OnDoubleTapListener { private PhotoViewAttacher photoViewAttacher; /** * Default constructor * * @param photoViewAttacher PhotoViewAttacher to bind to */ public DefaultOnDoubleTapListener(PhotoViewAttacher photoViewAttacher) { setPhotoViewAttacher(photoViewAttacher); } /** * Allows to change PhotoViewAttacher within range of single instance * * @param newPhotoViewAttacher PhotoViewAttacher to bind to */ public void setPhotoViewAttacher(PhotoViewAttacher newPhotoViewAttacher) { this.photoViewAttacher = newPhotoViewAttacher; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (this.photoViewAttacher == null) return false; ImageView imageView = photoViewAttacher.getImageView(); if (null != photoViewAttacher.getOnPhotoTapListener()) { final RectF displayRect = photoViewAttacher.getDisplayRect(); if (null != displayRect) { final float x = e.getX(), y = e.getY(); // Check to see if the user tapped on the photo if (displayRect.contains(x, y)) { float xResult = (x - displayRect.left) / displayRect.width(); float yResult = (y - displayRect.top) / displayRect.height(); photoViewAttacher.getOnPhotoTapListener().onPhotoTap(imageView, xResult, yResult); return true; } } } if (null != photoViewAttacher.getOnViewTapListener()) { photoViewAttacher.getOnViewTapListener().onViewTap(imageView, e.getX(), e.getY()); } return false; } @Override public boolean onDoubleTap(MotionEvent ev) { if (photoViewAttacher == null) return false; try { float scale = photoViewAttacher.getScale(); float x = ev.getX(); float y = ev.getY(); if (scale < photoViewAttacher.getMediumScale()) { photoViewAttacher.setScale(photoViewAttacher.getMediumScale(), x, y, true); } else if (scale >= photoViewAttacher.getMediumScale() && scale < photoViewAttacher.getMaximumScale()) { photoViewAttacher.setScale(photoViewAttacher.getMaximumScale(), x, y, true); } else { photoViewAttacher.setScale(photoViewAttacher.getMinimumScale(), x, y, true); } } catch (ArrayIndexOutOfBoundsException e) { // Can sometimes happen when getX() and getY() is called } return true; } @Override public boolean onDoubleTapEvent(MotionEvent e) { // Wait for the confirmed onDoubleTap() instead return false; } }