diff options
| -rw-r--r-- | res/layout-land/camera_controls.xml | 44 | ||||
| -rw-r--r-- | res/layout-port/camera_controls.xml | 47 | ||||
| -rw-r--r-- | res/values/dimens.xml | 1 | ||||
| -rw-r--r-- | src/com/android/camera/CameraActivity.java | 41 | ||||
| -rw-r--r-- | src/com/android/camera/PhotoModule.java | 25 | ||||
| -rwxr-xr-x | src/com/android/camera/ShutterButton.java | 6 | ||||
| -rw-r--r-- | src/com/android/camera/ui/CameraSwitcher.java | 23 | ||||
| -rw-r--r-- | src/com/android/camera/ui/RotatableLayout.java | 32 |
8 files changed, 133 insertions, 86 deletions
diff --git a/res/layout-land/camera_controls.xml b/res/layout-land/camera_controls.xml index a909c5132..f0f3ecca2 100644 --- a/res/layout-land/camera_controls.xml +++ b/res/layout-land/camera_controls.xml @@ -13,21 +13,16 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<com.android.camera.ui.RotatableLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/camera_controls" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <com.android.camera.ui.RotatableLayout - style="@style/CameraControls" - android:id="@+id/menu_button" - android:layout_gravity="center" > + style="@style/CameraControls" + android:layout_gravity="center" > <View android:id="@+id/blocker" android:layout_height="match_parent" android:layout_width="@dimen/switcher_size" - android:background="@drawable/switcher_bg" android:clickable="true" android:layout_gravity="right" /> @@ -44,30 +39,23 @@ android:contentDescription="@string/accessibility_menu_button" android:layout_gravity="right|top" android:layout_marginRight="2dip" /> - </com.android.camera.ui.RotatableLayout> - <com.android.camera.ui.RotatableLayout - style="@style/CameraControls" - android:id="@+id/switcher_control" - android:layout_gravity="right|center_horizontal" > <com.android.camera.ui.CameraSwitcher android:id="@+id/camera_switcher" style="@style/SwitcherButton" android:layout_gravity="right|bottom" android:layout_marginRight="2dip" android:contentDescription="@string/accessibility_mode_picker" /> - </com.android.camera.ui.RotatableLayout> - - <com.android.camera.ShutterButton - android:id="@+id/shutter_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="right|center_vertical" - android:layout_marginRight="@dimen/shutter_offset" - android:clickable="true" - android:contentDescription="@string/accessibility_shutter_button" - android:focusable="true" - android:scaleType="center" - android:src="@drawable/btn_new_shutter" /> -</FrameLayout>
\ No newline at end of file + <com.android.camera.ShutterButton + android:id="@+id/shutter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right|center_vertical" + android:layout_marginRight="@dimen/shutter_offset" + android:clickable="true" + android:contentDescription="@string/accessibility_shutter_button" + android:focusable="true" + android:scaleType="center" + android:src="@drawable/btn_new_shutter" /> +</com.android.camera.ui.RotatableLayout> diff --git a/res/layout-port/camera_controls.xml b/res/layout-port/camera_controls.xml index caad86860..7108b3c16 100644 --- a/res/layout-port/camera_controls.xml +++ b/res/layout-port/camera_controls.xml @@ -13,22 +13,17 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<com.android.camera.ui.RotatableLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/camera_controls" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <com.android.camera.ui.RotatableLayout - style="@style/CameraControls" - android:id="@+id/menu_button" - android:layout_gravity="center" > + style="@style/CameraControls" + android:layout_gravity="center" > <View android:id="@+id/blocker" android:layout_width="match_parent" android:layout_height="@dimen/switcher_size" android:layout_gravity="bottom" - android:background="@drawable/switcher_bg" android:clickable="true" /> <include layout="@layout/menu_indicators" @@ -45,31 +40,23 @@ android:layout_marginBottom="2dip" android:contentDescription="@string/accessibility_menu_button" /> - </com.android.camera.ui.RotatableLayout> - - <com.android.camera.ui.RotatableLayout - style="@style/CameraControls" - android:id="@+id/switcher_control" - android:layout_gravity="bottom|center_horizontal"> - <com.android.camera.ui.CameraSwitcher android:id="@+id/camera_switcher" style="@style/SwitcherButton" android:layout_gravity="bottom|left" android:layout_marginBottom="2dip" android:contentDescription="@string/accessibility_mode_picker" /> - </com.android.camera.ui.RotatableLayout> - - <com.android.camera.ShutterButton - android:id="@+id/shutter_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|center_horizontal" - android:layout_marginBottom="@dimen/shutter_offset" - android:clickable="true" - android:contentDescription="@string/accessibility_shutter_button" - android:focusable="true" - android:scaleType="center" - android:src="@drawable/btn_new_shutter" /> -</FrameLayout>
\ No newline at end of file + <com.android.camera.ShutterButton + android:id="@+id/shutter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|center_horizontal" + android:layout_marginBottom="@dimen/shutter_offset" + android:clickable="true" + android:contentDescription="@string/accessibility_shutter_button" + android:focusable="true" + android:scaleType="center" + android:src="@drawable/btn_new_shutter" /> + +</com.android.camera.ui.RotatableLayout>
\ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 581c76173..c51b8375a 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -91,4 +91,5 @@ <dimen name="margin_systemui_offset">6dip</dimen> <dimen name="size_thumbnail">200dip</dimen> <dimen name="size_preview">600dip</dimen> + <dimen name="navigation_bar_height">48dip</dimen> </resources> diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index eed347079..b1f0847d8 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -61,7 +61,6 @@ public class CameraActivity extends ActivityBase private View mCameraControls; private View mControlsBackground; private View mPieMenuButton; - private View mSwitcherControl; private Drawable[] mDrawables; private int mCurrentModuleIndex; private MotionEvent mDown; @@ -122,8 +121,7 @@ public class CameraActivity extends ActivityBase mCameraControls = findViewById(R.id.camera_controls); mShutter = (ShutterButton) findViewById(R.id.shutter_button); mSwitcher = (CameraSwitcher) findViewById(R.id.camera_switcher); - mPieMenuButton = findViewById(R.id.menu_button); - mSwitcherControl = findViewById(R.id.switcher_control); + mPieMenuButton = findViewById(R.id.menu); int totaldrawid = (LightCycleHelper.hasLightCycleCapture(this) ? DRAW_IDS.length : DRAW_IDS.length - 1); if (!ApiHelper.HAS_OLD_PANORAMA) totaldrawid--; @@ -222,11 +220,8 @@ public class CameraActivity extends ActivityBase mCurrentModule = LightCycleHelper.createPanoramaModule(); break; } - if (mCurrentModule.needsPieMenu()) { - mPieMenuButton.setVisibility(View.VISIBLE); - } else { - mPieMenuButton.setVisibility(View.INVISIBLE); - } + showPieMenuButton(mCurrentModule.needsPieMenu()); + openModule(mCurrentModule, canReuse); mCurrentModule.onOrientationChanged(mLastRawOrientation); if (mMediaSaveService != null) { @@ -236,6 +231,18 @@ public class CameraActivity extends ActivityBase getCameraScreenNail().setOnFrameDrawnOneShot(mOnFrameDrawn); } + public void showPieMenuButton(boolean show) { + if (show) { + findViewById(R.id.blocker).setVisibility(View.VISIBLE); + findViewById(R.id.menu).setVisibility(View.VISIBLE); + findViewById(R.id.on_screen_indicators).setVisibility(View.VISIBLE); + } else { + findViewById(R.id.blocker).setVisibility(View.INVISIBLE); + findViewById(R.id.menu).setVisibility(View.INVISIBLE); + findViewById(R.id.on_screen_indicators).setVisibility(View.INVISIBLE); + } + } + private Runnable mOnFrameDrawn = new Runnable() { @Override @@ -313,17 +320,23 @@ public class CameraActivity extends ActivityBase ViewGroup appRoot = (ViewGroup) findViewById(R.id.content); boolean landscape = (config.orientation == Configuration.ORIENTATION_LANDSCAPE); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) appRoot.getLayoutParams(); + int offset = getResources().getDimensionPixelSize(R.dimen.margin_systemui_offset); + int navBarHeight = getResources().getDimensionPixelSize(R.dimen.navigation_bar_height); if (landscape) { - lp.rightMargin = getResources().getDimensionPixelSize(R.dimen.margin_systemui_offset); + lp.rightMargin = offset; } else { lp.rightMargin = 0; } appRoot.setLayoutParams(lp); - // Reset the background after rotation - mControlsBackground.setBackgroundResource(0); // remove the current background - mControlsBackground.setBackgroundResource(R.drawable.switcher_bg); - + // Set padding to move camera controls away from the edge of the screen + // so that they are in the same place as if there was a navigation bar between + // the screen edge and the controls + if (landscape) { + mCameraControls.setPadding(navBarHeight, 0, 0, 0); + } else { + mCameraControls.setPadding(0, navBarHeight, 0, 0); + } mCurrentModule.onConfigurationChanged(config); } @@ -466,7 +479,7 @@ public class CameraActivity extends ActivityBase if ((mSwitcher != null) && mSwitcher.showsPopup() && !mSwitcher.isInsidePopup(m)) { return mSwitcher.onTouch(null, m); } else { - return mSwitcherControl.dispatchTouchEvent(m) + return mCameraControls.dispatchTouchEvent(m) || mCurrentModule.dispatchTouchEvent(m); } } diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 664246a8a..9a4546142 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -54,6 +54,7 @@ import android.view.SurfaceHolder; import android.view.View; import android.view.ViewStub; import android.view.View.OnClickListener; +import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; @@ -206,6 +207,14 @@ public class PhotoModule } }; + private final View.OnLayoutChangeListener mLayoutChangeListener = + new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, + int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + onScreenSizeChanged(right - left, bottom - top); + } + }; private final StringBuilder mBuilder = new StringBuilder(); private final Formatter mFormatter = new Formatter(mBuilder); private final Object[] mFormatterArgs = new Object[1]; @@ -461,6 +470,7 @@ public class PhotoModule mActivity.getLayoutInflater().inflate(R.layout.photo_module, (ViewGroup) mRootView, true); + mRootView.addOnLayoutChangeListener(mLayoutChangeListener); if (ApiHelper.HAS_FACE_DETECTION) { ViewStub faceViewStub = (ViewStub) mRootView .findViewById(R.id.face_view_stub); @@ -586,8 +596,8 @@ public class PhotoModule initializePhotoControl(); // These depend on camera parameters. - int width = mActivity.getWindowManager().getDefaultDisplay().getWidth(); - int height = mActivity.getWindowManager().getDefaultDisplay().getHeight(); + int width = mRootView.getWidth(); + int height = mRootView.getHeight(); mFocusManager.setPreviewSize(width, height); // Full-screen screennail if (Util.getDisplayRotation(mActivity) % 180 == 0) { @@ -604,6 +614,16 @@ public class PhotoModule onFullScreenChanged(mActivity.isInCameraApp()); } + public void onScreenSizeChanged(int width, int height) { + if (mFocusManager != null) mFocusManager.setPreviewSize(width, height); + // Full-screen screennail + if (Util.getDisplayRotation(mActivity) % 180 == 0) { + ((CameraScreenNail) mActivity.mCameraScreenNail).setPreviewFrameLayoutSize(width, height); + } else { + ((CameraScreenNail) mActivity.mCameraScreenNail).setPreviewFrameLayoutSize(height, width); + } + } + private void initializePhotoControl() { loadCameraPreferences(); if (mPhotoControl != null) { @@ -1618,6 +1638,7 @@ public class PhotoModule mHandler.removeMessages(OPEN_CAMERA_FAIL); mHandler.removeMessages(CAMERA_DISABLED); + mRootView.removeOnLayoutChangeListener(mLayoutChangeListener); mPendingSwitchCameraId = -1; if (mFocusManager != null) mFocusManager.removeMessages(); MediaSaveService s = mActivity.getMediaSaveService(); diff --git a/src/com/android/camera/ShutterButton.java b/src/com/android/camera/ShutterButton.java index 41775a186..228fc51a3 100755 --- a/src/com/android/camera/ShutterButton.java +++ b/src/com/android/camera/ShutterButton.java @@ -130,10 +130,4 @@ public class ShutterButton extends ImageView { } return result; } - - @Override - public void onConfigurationChanged(Configuration config) { - super.onConfigurationChanged(config); - RotatableLayout.rotate(this, config.orientation == Configuration.ORIENTATION_PORTRAIT); - } } diff --git a/src/com/android/camera/ui/CameraSwitcher.java b/src/com/android/camera/ui/CameraSwitcher.java index 3fa4a01d5..897729b46 100644 --- a/src/com/android/camera/ui/CameraSwitcher.java +++ b/src/com/android/camera/ui/CameraSwitcher.java @@ -19,11 +19,13 @@ package com.android.camera.ui; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; +import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -33,6 +35,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout.LayoutParams; import android.widget.LinearLayout; +import com.android.camera.Util; import com.android.gallery3d.R; import com.android.gallery3d.common.ApiHelper; @@ -120,6 +123,13 @@ public class CameraSwitcher extends RotateImageView (ViewGroup) getParent()); LinearLayout content = (LinearLayout) mParent.findViewById(R.id.content); mPopup = content; + // Set the gravity of the popup, so that it shows up at the right position + // on screen + LayoutParams lp = ((LayoutParams) mPopup.getLayoutParams()); + lp.gravity = ((LayoutParams) mParent.findViewById(R.id.camera_switcher) + .getLayoutParams()).gravity; + mPopup.setLayoutParams(lp); + mPopup.setVisibility(View.INVISIBLE); mNeedsAnimationSetup = true; for (int i = mDrawIds.length - 1; i >= 0; i--) { @@ -224,15 +234,22 @@ public class CameraSwitcher extends RotateImageView } private void updateInitialTranslations() { - if (getResources().getConfiguration().orientation - == Configuration.ORIENTATION_PORTRAIT) { + int orientation = Util.getDisplayRotation((Activity) getContext()); + if (orientation == 0) { mTranslationX = -getWidth() / 2; mTranslationY = getHeight(); - } else { + } else if (orientation == 90) { mTranslationX = getWidth(); mTranslationY = getHeight() / 2; + } else if (orientation == 180) { + mTranslationX = getWidth(); + mTranslationY = -getHeight() / 2; + } else { + mTranslationX = -getWidth(); + mTranslationY = -getHeight() / 2; } } + private void popupAnimationSetup() { if (!ApiHelper.HAS_VIEW_PROPERTY_ANIMATOR) { return; diff --git a/src/com/android/camera/ui/RotatableLayout.java b/src/com/android/camera/ui/RotatableLayout.java index 9c5ebd34d..4edec5dd7 100644 --- a/src/com/android/camera/ui/RotatableLayout.java +++ b/src/com/android/camera/ui/RotatableLayout.java @@ -16,13 +16,17 @@ package com.android.camera.ui; +import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.widget.FrameLayout; +import com.android.camera.Util; + /* RotatableLayout rotates itself as well as all its children when orientation * changes. Specifically, when going from portrait to landscape, camera * controls move from the bottom of the screen to right side of the screen @@ -33,6 +37,8 @@ import android.widget.FrameLayout; public class RotatableLayout extends FrameLayout { + private static final String TAG = "RotatableLayout"; + private int mPrevRotation; public RotatableLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @@ -46,11 +52,24 @@ public class RotatableLayout extends FrameLayout { } @Override + public void onFinishInflate() { // get initial orientation + mPrevRotation = Util.getDisplayRotation((Activity) getContext()); + } + + @Override public void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); - // rotate the layout itself and all its children - boolean clockwise = (config.orientation == Configuration.ORIENTATION_PORTRAIT); - rotate(this, clockwise); + // Change the size of the layout + ViewGroup.LayoutParams lp = getLayoutParams(); + int width = lp.width; + int height = lp.height; + lp.height = width; + lp.width = height; + setLayoutParams(lp); + // rotate all the children + int rotation = Util.getDisplayRotation((Activity) getContext()); + boolean clockwise = isClockWiseRotation(mPrevRotation, rotation); + mPrevRotation = rotation; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); @@ -58,6 +77,13 @@ public class RotatableLayout extends FrameLayout { } } + public static boolean isClockWiseRotation(int prevRotation, int currentRotation) { + if (prevRotation == (currentRotation + 90) % 360) { + return true; + } + return false; + } + public static void rotate(View view, boolean isClockwise) { if (isClockwise) { rotateClockwise(view); |
