1adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang/* 2adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Copyright (C) 2011 The Android Open Source Project 3adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * 4adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * you may not use this file except in compliance with the License. 6adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * You may obtain a copy of the License at 7adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * 8adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * http://www.apache.org/licenses/LICENSE-2.0 9adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * 10adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Unless required by applicable law or agreed to in writing, software 11adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS, 12adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * See the License for the specific language governing permissions and 14adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * limitations under the License. 15adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang */ 16adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 17adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangpackage com.android.camera.ui; 18adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 19adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport com.android.camera.R; 20adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 21adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.content.Context; 22ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.os.Handler; 23adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.util.AttributeSet; 24adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.view.View; 25ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.widget.ImageView; 26adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.widget.RelativeLayout; 27adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 28adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang/** 29adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * A view that contains camera zoom control which could adjust the zoom in/out 30adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * if the camera supports zooming. 31adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang */ 323ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huangpublic abstract class ZoomControl extends RelativeLayout implements Rotatable { 33b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // The states of zoom button. 34b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang public static final int ZOOM_IN = 0; 35b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang public static final int ZOOM_OUT = 1; 36b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang public static final int ZOOM_STOP = 2; 37adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 38b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private static final String TAG = "ZoomControl"; 39b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private static final int ZOOMING_INTERVAL = 1000; // milliseconds 40ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 41ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected ImageView mZoomIn; 42ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected ImageView mZoomOut; 43ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected ImageView mZoomSlider; 443ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang protected int mOrientation; 45b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private Handler mHandler; 46ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 47adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public interface OnZoomChangedListener { 48adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang void onZoomValueChanged(int index); // only for immediate zoom 49adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang void onZoomStateChanged(int state); // only for smooth zoom 50adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 51adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 52d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang // The interface OnZoomIndexChangedListener is used to inform the 53d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang // ZoomIndexBar about the zoom index change. The index position is between 54d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang // 0 (the index is zero) and 1.0 (the index is mZoomMax). 55d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang public interface OnZoomIndexChangedListener { 56d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang void onZoomIndexChanged(double indexPosition); 57d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang } 58d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang 59ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected int mZoomMax, mZoomIndex; 60adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private boolean mSmoothZoomSupported; 61adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private OnZoomChangedListener mListener; 62d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang private OnZoomIndexChangedListener mIndexListener; 63adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 64adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang protected OnIndicatorEventListener mOnIndicatorEventListener; 65b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private int mState; 66b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private int mStep; 67adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 68ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected final Runnable mRunnable = new Runnable() { 69ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public void run() { 70b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang performZoom(mState, false); 71ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang } 72ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang }; 73ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 74adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public ZoomControl(Context context, AttributeSet attrs) { 75adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang super(context, attrs); 76606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang mZoomIn = addImageView(context, R.drawable.ic_zoom_in); 77606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang mZoomSlider = addImageView(context, R.drawable.ic_zoom_slider); 78606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang mZoomOut = addImageView(context, R.drawable.ic_zoom_out); 79ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mHandler = new Handler(); 80ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang } 81adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 82ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public void startZoomControl() { 83ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mZoomSlider.setPressed(true); 84d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang setZoomIndex(mZoomIndex); // Update the zoom index bar. 85adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 86adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 87ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang protected ImageView addImageView(Context context, int iconResourceId) { 88ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang ImageView image = new RotateImageView(context); 89ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang image.setImageResource(iconResourceId); 9026d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang if (iconResourceId == R.drawable.ic_zoom_slider) { 9126d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang image.setContentDescription(getResources().getString( 9226d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang R.string.accessibility_zoom_control)); 9326d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang } else { 9426d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang image.setContentDescription(getResources().getString( 9526d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang R.string.empty)); 9626d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang } 97ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang addView(image); 98ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang return image; 99adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 100adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 101ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public void closeZoomControl() { 102ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mZoomSlider.setPressed(false); 103ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang stopZooming(); 104b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (!mSmoothZoomSupported) mHandler.removeCallbacks(mRunnable); 105b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (mOnIndicatorEventListener != null) { 106b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mOnIndicatorEventListener.onIndicatorEvent( 107b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang OnIndicatorEventListener.EVENT_LEAVE_ZOOM_CONTROL); 108b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 109ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang } 110ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 111ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public void setZoomMax(int zoomMax) { 112ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mZoomMax = zoomMax; 113606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang 114606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang // Layout should be requested as the maximum zoom level is the key to 115606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang // show the correct zoom slider position. 116606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang requestLayout(); 117adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 118adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 119adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void setOnZoomChangeListener(OnZoomChangedListener listener) { 120adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mListener = listener; 121adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 122adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 123adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void setOnIndicatorEventListener(OnIndicatorEventListener listener) { 124adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mOnIndicatorEventListener = listener; 125adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 126adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 127adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void setZoomIndex(int index) { 128adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (index < 0 || index > mZoomMax) { 129adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang throw new IllegalArgumentException("Invalid zoom value:" + index); 130adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 131adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mZoomIndex = index; 132ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang invalidate(); 133adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 134adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 135adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void setSmoothZoomSupported(boolean smoothZoomSupported) { 136adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mSmoothZoomSupported = smoothZoomSupported; 137adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 138adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 139b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private boolean zoomIn() { 140b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang return (mZoomIndex == mZoomMax) ? false : changeZoomIndex(mZoomIndex + mStep); 141b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 142b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 143b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private boolean zoomOut() { 144b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang return (mZoomIndex == 0) ? false : changeZoomIndex(mZoomIndex - mStep); 145adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 146adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 147b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang protected void setZoomStep(int step) { 148b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mStep = step; 149adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 150adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 151b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private void stopZooming() { 152adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (mSmoothZoomSupported) { 153adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (mListener != null) mListener.onZoomStateChanged(ZOOM_STOP); 154adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 155adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 156adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 157b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // Called from ZoomControlWheel to change the zoom level. 158b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // TODO: merge the zoom control for both platforms. 159b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang protected void performZoom(int state) { 160b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang performZoom(state, true); 161b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 162b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 163b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private void performZoom(int state, boolean fromUser) { 164b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if ((mState == state) && fromUser) return; 165b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (fromUser) mHandler.removeCallbacks(mRunnable); 166b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mState = state; 167b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang switch (state) { 168b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang case ZOOM_IN: 169b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang zoomIn(); 170b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang break; 171b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang case ZOOM_OUT: 172b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang zoomOut(); 173b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang break; 174b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang case ZOOM_STOP: 175b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang stopZooming(); 176b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang break; 177b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 178b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (!mSmoothZoomSupported) { 179b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // Repeat the zoom action on tablet as the user is still holding 180b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // the zoom slider. 181b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mHandler.postDelayed(mRunnable, ZOOMING_INTERVAL / mZoomMax); 182b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 183b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 184b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 185b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // Called from ZoomControlBar to change the zoom level. 186b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang protected void performZoom(double zoomPercentage) { 187b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang int index = (int) (mZoomMax * zoomPercentage); 188b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (mZoomIndex == index) return; 189b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang changeZoomIndex(index); 190b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 191b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 192adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private boolean changeZoomIndex(int index) { 193adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (mListener != null) { 194adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (mSmoothZoomSupported) { 195b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang int zoomType = (index < mZoomIndex) ? ZOOM_OUT : ZOOM_IN; 196adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (((zoomType == ZOOM_IN) && (mZoomIndex != mZoomMax)) || 197adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang ((zoomType == ZOOM_OUT) && (mZoomIndex != 0))) { 198adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mListener.onZoomStateChanged(zoomType); 199adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 200adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } else { 201b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (index > mZoomMax) index = mZoomMax; 202b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (index < 0) index = 0; 203b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mListener.onZoomValueChanged(index); 204175d7d64e2990e92eb1609f8f706b6f568b22800Wu-cheng Li mZoomIndex = index; 205adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 206adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 207adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang return true; 208adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 209adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 2103ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang public void setOrientation(int orientation) { 2113ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang mOrientation = orientation; 212adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang int count = getChildCount(); 213adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang for (int i = 0 ; i < count ; ++i) { 214adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang View view = getChildAt(i); 215adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (view instanceof RotateImageView) { 2163ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang ((RotateImageView) view).setOrientation(orientation); 217adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 218adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 219adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 220606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang 221606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang @Override 222606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang public void setActivated(boolean activated) { 223606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang super.setActivated(activated); 224606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang mZoomIn.setActivated(activated); 225606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang mZoomOut.setActivated(activated); 226606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang } 227adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang} 228