/** * Copyright (C) 2013- Iordan Iordanov * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ package com.undatech.opaque.input; import android.view.MotionEvent; import android.os.Vibrator; import com.undatech.opaque.R; import com.undatech.opaque.Constants; import com.undatech.opaque.RemoteCanvas; import com.undatech.opaque.RemoteCanvasActivity; import com.undatech.opaque.input.RemotePointer; public class InputHandlerDirectDragPan extends InputHandlerGeneric { static final String TAG = "InputHandlerDirectDragPan"; public static final String ID = "DirectDragPan"; /** * @param c */ public InputHandlerDirectDragPan(RemoteCanvasActivity activity, RemoteCanvas canvas, Vibrator myVibrator) { super(activity, canvas, myVibrator); } /* * (non-Javadoc) * @see com.undatech.opaque.input.InputHandler#getDescription() */ @Override public String getDescription() { return canvas.getResources().getString(R.string.input_method_direct_drag_pan_description); } /* * (non-Javadoc) * @see com.undatech.opaque.input.InputHandler#getId() */ @Override public String getId() { return ID; } /* * (non-Javadoc) * @see com.undatech.opaque.input.InputHandlerGeneric#onLongPress(android.view.MotionEvent) */ @Override public void onLongPress(MotionEvent e) { // If we've performed a right/middle-click and the gesture is not over yet, do not start drag mode. if (secondPointerWasDown || thirdPointerWasDown) return; myVibrator.vibrate(Constants.SHORT_VIBRATION); canvas.displayShortToastMessage("Panning"); endDragModesAndScrolling(); panMode = true; } /* * (non-Javadoc) * @see android.view.GestureDetector.SimpleOnGestureListener#onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float) */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { RemotePointer p = canvas.getPointer(); // If we are scaling, allow panning around by moving two fingers around the screen if (inScaling) { float scale = canvas.getZoomFactor(); activity.showKbdIcon(); canvas.relativePan((int)(distanceX*scale), (int)(distanceY*scale)); } else { // onScroll called while scaling/swiping gesture is in effect. We ignore the event and pretend it was // consumed. This prevents the mouse pointer from flailing around while we are scaling. // Also, if one releases one finger slightly earlier than the other when scaling, it causes Android // to stick a spiteful onScroll with a MASSIVE delta here. // This would cause the mouse pointer to jump to another place suddenly. // Hence, we ignore onScroll after scaling until we lift all pointers up. boolean twoFingers = false; if (e1 != null) twoFingers = (e1.getPointerCount() > 1); if (e2 != null) twoFingers = twoFingers || (e2.getPointerCount() > 1); if (twoFingers||inSwiping||scalingJustFinished) return true; activity.showKbdIcon(); if (!dragMode) { dragMode = true; p.leftButtonDown(getX(e1), getY(e1), e1.getMetaState()); } else { p.moveMouseButtonDown(getX(e2), getY(e2), e2.getMetaState()); } } canvas.movePanToMakePointerVisible(); return true; } }