diff options
Diffstat (limited to 'src/com/android/camera/ui/ZoomControlBar.java')
-rw-r--r-- | src/com/android/camera/ui/ZoomControlBar.java | 158 |
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); + } +} |