/* * 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 com.android.camera.Util; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 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 THRESHOLD_FIRST_MOVE = Util.dpToPixel(10); // pixels // Space between indicator icon and the zoom-in/out icon. private static final int ICON_SPACING = Util.dpToPixel(12); private View mBar; private boolean mStartChanging; private int mSliderPosition = 0; private int mSliderLength; private int mWidth; private int mIconWidth; private int mTotalIconWidth; public ZoomControlBar(Context context, AttributeSet attrs) { super(context, attrs); mBar = new View(context); mBar.setBackgroundResource(R.drawable.zoom_slider_bar); addView(mBar); } @Override public void setActivated(boolean activated) { super.setActivated(activated); mBar.setActivated(activated); } private int getSliderPosition(int x) { // Calculate the absolute offset of the slider in the zoom control bar. // 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. int pos; // the relative position in the zoom slider bar if (mOrientation == 90) { pos = mWidth - mTotalIconWidth - x; } else { pos = x - mTotalIconWidth; } if (pos < 0) pos = 0; if (pos > mSliderLength) pos = mSliderLength; return pos; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mWidth = w; mIconWidth = mZoomIn.getMeasuredWidth(); mTotalIconWidth = mIconWidth + ICON_SPACING; mSliderLength = mWidth - (2 * mTotalIconWidth); } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (!isEnabled() || (mWidth == 0)) return false; int action = event.getAction(); switch (action) { case MotionEvent.ACTION_OUTSIDE: case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: setActivated(false); closeZoomControl(); break; case MotionEvent.ACTION_DOWN: setActivated(true); mStartChanging = false; case MotionEvent.ACTION_MOVE: int pos = getSliderPosition((int) event.getX()); if (!mStartChanging) { // Make sure the movement is large enough before we start // changing the zoom. int delta = mSliderPosition - pos; if ((delta > THRESHOLD_FIRST_MOVE) || (delta < -THRESHOLD_FIRST_MOVE)) { mStartChanging = true; } } if (mStartChanging) { performZoom(1.0d * pos / mSliderLength); mSliderPosition = pos; } requestLayout(); } return true; } @Override public void setOrientation(int orientation) { // layout for the left-hand camera control if ((orientation == 90) || (mOrientation == 90)) requestLayout(); super.setOrientation(orientation); } @Override protected void onLayout( boolean changed, int left, int top, int right, int bottom) { if (mZoomMax == 0) return; int height = bottom - top; mBar.layout(mTotalIconWidth, 0, mWidth - mTotalIconWidth, height); // For left-hand users, as the device is rotated for 180 degree, // the zoom-in button should be on the top. int pos; // slider position int sliderPosition; if (mSliderPosition != -1) { // -1 means invalid sliderPosition = mSliderPosition; } else { sliderPosition = (int) ((double) mSliderLength * mZoomIndex / mZoomMax); } if (mOrientation == 90) { mZoomIn.layout(0, 0, mIconWidth, height); mZoomOut.layout(mWidth - mIconWidth, 0, mWidth, height); pos = mBar.getRight() - sliderPosition; } else { mZoomOut.layout(0, 0, mIconWidth, height); mZoomIn.layout(mWidth - mIconWidth, 0, mWidth, height); pos = mBar.getLeft() + sliderPosition; } int sliderWidth = mZoomSlider.getMeasuredWidth(); mZoomSlider.layout((pos - sliderWidth / 2), 0, (pos + sliderWidth / 2), height); } @Override public void setZoomIndex(int index) { super.setZoomIndex(index); mSliderPosition = -1; // -1 means invalid requestLayout(); } }