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