FilmStripGestureRecognizer.java revision 49b9ba2ba89760f297ecc7d6d94d68fb4b836be1
149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong/* 249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * Copyright (C) 2013 The Android Open Source Project 349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * 449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * Licensed under the Apache License, Version 2.0 (the "License"); 549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * you may not use this file except in compliance with the License. 649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * You may obtain a copy of the License at 749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * 849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * http://www.apache.org/licenses/LICENSE-2.0 949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * 1049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * Unless required by applicable law or agreed to in writing, software 1149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * distributed under the License is distributed on an "AS IS" BASIS, 1249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * See the License for the specific language governing permissions and 1449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong * limitations under the License. 1549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong */ 1649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 1749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongpackage com.android.camera.ui; 1849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 1949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongimport android.content.Context; 2049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongimport android.view.GestureDetector; 2149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongimport android.view.MotionEvent; 2249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongimport android.view.ScaleGestureDetector; 2349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 2449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong// This class aggregates three gesture detectors: GestureDetector, 2549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong// ScaleGestureDetector. 2649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kongpublic class FilmStripGestureRecognizer { 2749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @SuppressWarnings("unused") 2849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private static final String TAG = "FilmStripGestureRecognizer"; 2949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 3049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public interface Listener { 3149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onSingleTapUp(float x, float y); 3249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onDoubleTap(float x, float y); 3349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onScroll(float x, float y, float dx, float dy); 3449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onFling(float velocityX, float velocityY); 3549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onScaleBegin(float focusX, float focusY); 3649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onScale(float focusX, float focusY, float scale); 3749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong boolean onDown(float x, float y); 3849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong void onScaleEnd(); 3949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 4049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 4149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private final GestureDetector mGestureDetector; 4249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private final ScaleGestureDetector mScaleDetector; 4349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private final Listener mListener; 4449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 4549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public FilmStripGestureRecognizer(Context context, Listener listener) { 4649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong mListener = listener; 4749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong mGestureDetector = new GestureDetector(context, new MyGestureListener(), 4849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong null, true /* ignoreMultitouch */); 4949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong mScaleDetector = new ScaleGestureDetector( 5049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong context, new MyScaleListener()); 5149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 5249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 5349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onTouchEvent(MotionEvent event) { 5449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mGestureDetector.onTouchEvent(event) || mScaleDetector.onTouchEvent(event); 5549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 5649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 5749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private class MyGestureListener 5849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong extends GestureDetector.SimpleOnGestureListener { 5949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 6049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onSingleTapUp(MotionEvent e) { 6149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onSingleTapUp(e.getX(), e.getY()); 6249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 6349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 6449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 6549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onDoubleTap(MotionEvent e) { 6649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onDoubleTap(e.getX(), e.getY()); 6749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 6849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 6949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 7049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onScroll( 7149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong MotionEvent e1, MotionEvent e2, float dx, float dy) { 7249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onScroll(e2.getX(), e2.getY(), dx, dy); 7349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 7449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 7549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 7649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 7749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong float velocityY) { 7849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onFling(velocityX, velocityY); 7949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 8049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 8149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 8249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onDown(MotionEvent e) { 8349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong mListener.onDown(e.getX(), e.getY()); 8449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return super.onDown(e); 8549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 8649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 8749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 8849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong private class MyScaleListener 8949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong extends ScaleGestureDetector.SimpleOnScaleGestureListener { 9049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 9149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onScaleBegin(ScaleGestureDetector detector) { 9249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onScaleBegin( 9349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong detector.getFocusX(), detector.getFocusY()); 9449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 9549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 9649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 9749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public boolean onScale(ScaleGestureDetector detector) { 9849b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong return mListener.onScale(detector.getFocusX(), 9949b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong detector.getFocusY(), detector.getScaleFactor()); 10049b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 10149b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong 10249b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong @Override 10349b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong public void onScaleEnd(ScaleGestureDetector detector) { 10449b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong mListener.onScaleEnd(); 10549b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 10649b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong } 10749b9ba2ba89760f297ecc7d6d94d68fb4b836be1Angus Kong} 108