diff options
Diffstat (limited to 'src/com/android/camera/ShutterButton.java')
-rw-r--r-- | src/com/android/camera/ShutterButton.java | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/com/android/camera/ShutterButton.java b/src/com/android/camera/ShutterButton.java index 22223510c..b35658070 100644 --- a/src/com/android/camera/ShutterButton.java +++ b/src/com/android/camera/ShutterButton.java @@ -22,12 +22,14 @@ import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; +import com.android.camera.ui.RotateImageView; + /** * A button designed to be used for the on-screen shutter button. * It's currently an {@code ImageView} that can call a delegate when the * pressed state changes. */ -public class ShutterButton extends ImageView { +public class ShutterButton extends RotateImageView { private class LongClickListener implements View.OnLongClickListener { public boolean onLongClick(View v) { @@ -82,6 +84,51 @@ public class ShutterButton extends ImageView { setLongClickable(enable); } + /** + * Hook into the drawable state changing to get changes to isPressed -- the + * onPressed listener doesn't always get called when the pressed state + * changes. + */ + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + final boolean pressed = isPressed(); + if (pressed != mOldPressed) { + if (!pressed) { + // When pressing the physical camera button the sequence of + // events is: + // focus pressed, optional camera pressed, focus released. + // We want to emulate this sequence of events with the shutter + // button. When clicking using a trackball button, the view + // system changes the drawable state before posting click + // notification, so the sequence of events is: + // pressed(true), optional click, pressed(false) + // When clicking using touch events, the view system changes the + // drawable state after posting click notification, so the + // sequence of events is: + // pressed(true), pressed(false), optional click + // Since we're emulating the physical camera button, we want to + // have the same order of events. So we want the optional click + // callback to be delivered before the pressed(false) callback. + // + // To do this, we delay the posting of the pressed(false) event + // slightly by pushing it on the event queue. This moves it + // after the optional click notification, so our client always + // sees events in this sequence: + // pressed(true), optional click, pressed(false) + post(new Runnable() { + @Override + public void run() { + callShutterButtonFocus(pressed); + } + }); + } else { + callShutterButtonFocus(pressed); + } + mOldPressed = pressed; + } + } + private void callShutterButtonFocus(boolean pressed) { if (mListener != null) { mListener.onShutterButtonFocus(pressed); |