Java tutorial
/* Copyright (c) 2013 Richard G. Todd. * Licensed under the terms of the GNU General Public License (GPL) Version 3.0. */ package com.richtodd.android.pegboard; import junit.framework.Assert; import android.support.v4.view.GestureDetectorCompat; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; class PegboardViewTouchController { // private static final String TAG = "PegboardTouchController"; // // Fields // private enum Operations { NONE, DRAG_PEG } private Operations m_operation = Operations.NONE; private PegboardView m_view; private GestureDetectorCompat m_gestureDetector; // // Constructors // PegboardViewTouchController() { } // // Package-Private Methods // PegboardView getView() { return m_view; } void setView(PegboardView view) { m_view = view; m_gestureDetector = new GestureDetectorCompat(m_view.getContext(), new GestureDetector.OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { // Log.i(TAG, "m_gestureDetector/onSingleTapUp"); if (onTap((int) e.getX(), (int) e.getY())) { return true; } return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // Log.i(TAG, "m_gestureDetector/onScroll"); if (!isOperationActive()) { if (onTouchDown((int) e1.getX(), (int) e1.getY())) { return true; } } if (isOperationActive()) { if (onTouchMove((int) e2.getX(), (int) e2.getY())) { return true; } } return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public boolean onDown(MotionEvent e) { return true; } }); m_view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (m_gestureDetector.onTouchEvent(event)) { return true; } int action = event.getAction(); switch (action) { case MotionEvent.ACTION_UP: if (onTouchUp((int) event.getX(), (int) event.getY())) { return true; } } return false; } }); } // // Touch Primitives // private boolean onTap(int x, int y) { if (m_view.selectPeg(x, y)) { return true; } return false; } private boolean onTouchDown(int x, int y) { // Log.i(TAG, "onTouchDown(" + x + "," + y + ")"); cancelAnyActiveOperation(); if (beginDragPeg(x, y)) { return true; } return false; } private boolean onTouchMove(int x, int y) { // Log.i(TAG, "onTouchMove(" + x + "," + y + ")"); if (m_operation == Operations.DRAG_PEG) { dragPeg(x, y); return true; } return false; } private boolean onTouchUp(int x, int y) { // Log.i(TAG, "onTouchUp(" + x + "," + y + ")"); if (m_operation == Operations.DRAG_PEG) { completeDragPeg(x, y); return true; } return false; } private void cancelAnyActiveOperation() { if (m_operation == Operations.DRAG_PEG) { cancelDragPeg(); } } private boolean isOperationActive() { return m_operation != Operations.NONE; } // // Private Methods // private boolean beginDragPeg(int x, int y) { // Log.i(TAG, "beginDragPeg(" + x + "," + y + ")"); Assert.assertTrue(m_operation == Operations.NONE); if (m_view.beginDragPeg(x, y)) { m_operation = Operations.DRAG_PEG; return true; } return false; } private void dragPeg(int x, int y) { // Log.i(TAG, "dragPeg(" + x + "," + y + ")"); Assert.assertTrue(m_operation == Operations.DRAG_PEG); m_view.dragPeg(x, y); } private void completeDragPeg(int x, int y) { // Log.i(TAG, "completeDragPeg(" + x + "," + y + ")"); Assert.assertTrue(m_operation == Operations.DRAG_PEG); m_view.dragPeg(x, y); m_view.dropPeg(); m_operation = Operations.NONE; } private void cancelDragPeg() { // Log.i(TAG, "cancelPegDragDrop"); Assert.assertTrue(m_operation == Operations.DRAG_PEG); m_view.abandonPeg(); m_operation = Operations.NONE; } }