summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/ui/ZoomControlBar.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/ui/ZoomControlBar.java')
-rw-r--r--src/com/android/camera/ui/ZoomControlBar.java158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/com/android/camera/ui/ZoomControlBar.java b/src/com/android/camera/ui/ZoomControlBar.java
new file mode 100644
index 0000000..07ad143
--- /dev/null
+++ b/src/com/android/camera/ui/ZoomControlBar.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.ui;
+
+import com.android.camera.R;
+
+import android.content.Context;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * A view that contains camera zoom control and its layout.
+ */
+public class ZoomControlBar extends ZoomControl {
+ private static final String TAG = "ZoomControlBar";
+
+ private static final int ZOOMING_INTERVAL = 300; // milliseconds
+
+ private ImageView mZoomIn;
+ private ImageView mZoomOut;
+ private ImageView mZoomSlider;
+ private View mBar;
+ private int mSliderPosition = 0;
+ private Handler mHandler;
+ private int mDegree;
+
+ private final Runnable mRunnable = new Runnable() {
+ public void run() {
+ if (mSliderPosition < 0) {
+ zoomIn();
+ } else if (mSliderPosition > 0) {
+ zoomOut();
+ }
+ if (mSliderPosition != 0) mHandler.postDelayed(mRunnable, ZOOMING_INTERVAL);
+ }
+ };
+
+ public ZoomControlBar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void initialize(Context context) {
+ mZoomIn = addImageView(context, R.drawable.ic_zoom_in_holo_light);
+ mBar = new View(context);
+ mBar.setBackgroundResource(R.drawable.ic_zoom_big);
+ addView(mBar);
+ mZoomSlider = addImageView(context, R.drawable.btn_zoom_slider);
+ mZoomOut = addImageView(context, R.drawable.ic_zoom_out_holo_light);
+ mHandler = new Handler();
+ }
+
+ ImageView addImageView(Context context, int iconResourceId) {
+ ImageView image = new RotateImageView(context);
+ image.setImageResource(iconResourceId);
+ addView(image);
+ return image;
+ }
+
+ private void closeControl() {
+ mHandler.removeCallbacks(mRunnable);
+ mSliderPosition = 0;
+ stopZooming();
+ mOnIndicatorEventListener.onIndicatorEvent(
+ OnIndicatorEventListener.EVENT_LEAVE_ZOOM_CONTROL_BAR);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ if (!onFilterTouchEventForSecurity(event)) return false;
+
+ int action = event.getAction();
+
+ if (!isEnabled()) return false;
+
+ double y = (double) event.getY();
+ int offset = getHeight() / 2;
+
+ // For left-hand users, as the device is rotated for 180 degree for
+ // landscape mode, the zoom-in bottom should be on the top, so the
+ // position should be reversed.
+ if (mDegree == 180) {
+ mSliderPosition = offset - (int) y;
+ } else {
+ mSliderPosition = (int) y - offset;
+ }
+ // TODO: add fast zoom change here
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mHandler.postDelayed(mRunnable, ZOOMING_INTERVAL);
+ mZoomSlider.setPressed(true);
+ break;
+ case MotionEvent.ACTION_OUTSIDE:
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mZoomSlider.setPressed(false);
+ closeControl();
+ break;
+ default:
+ requestLayout();
+ }
+ return true;
+ }
+
+ @Override
+ public void setDegree(int degree) {
+ // layout for the left-hand camera control
+ if ((degree == 180) || (mDegree == 180)) requestLayout();
+ mDegree = degree;
+ super.setDegree(degree);
+ }
+
+ @Override
+ protected void onLayout(
+ boolean changed, int left, int top, int right, int bottom) {
+ int width = right - left;
+ int height = bottom - top;
+ int h = height / 2;
+ int pos;
+
+ // For left-hand users, as the device is rotated for 180 degree,
+ // the zoom-in button should be on the top.
+ if (mDegree == 180) {
+ pos = h - mSliderPosition - width / 2;
+ mZoomOut.layout(0, top, width, top + width);
+ mZoomIn.layout(0, bottom - width, width, bottom);
+ } else {
+ pos = h + mSliderPosition - width / 2;
+ mZoomIn.layout(0, top, width, top + width);
+ mZoomOut.layout(0, bottom - width, width, bottom);
+ }
+ mBar.layout(0, top + width, width, bottom - width);
+ if (pos < width) {
+ pos = width;
+ } else if (pos > (height - 2 * width)) {
+ pos = height - 2 * width;
+ }
+ mZoomSlider.layout(0, pos, width, pos + width);
+ }
+}