diff options
-rw-r--r-- | res/layout-xlarge/camera_control.xml | 33 | ||||
-rw-r--r-- | src/com/android/camera/Camera.java | 13 | ||||
-rw-r--r-- | src/com/android/camera/VideoCamera.java | 13 | ||||
-rw-r--r-- | src/com/android/camera/ui/SettingsWheel.java | 143 |
4 files changed, 187 insertions, 15 deletions
diff --git a/res/layout-xlarge/camera_control.xml b/res/layout-xlarge/camera_control.xml index 91e11ce..31ee6be 100644 --- a/res/layout-xlarge/camera_control.xml +++ b/res/layout-xlarge/camera_control.xml @@ -17,7 +17,7 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/control_bar" android:layout_height="match_parent" - android:layout_width="190dp" + android:layout_width="240dp" android:layout_marginTop="20dp" android:layout_marginBottom="20dp" android:layout_marginLeft="10dp" @@ -41,32 +41,35 @@ android:layout="@layout/zoom_picker" android:layout_alignParentTop="true" android:layout_alignParentRight="true" - android:layout_toRightOf="@id/image_list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_centerInParent="true"/> - <com.android.camera.ShutterButton android:id="@+id/shutter_button" - android:layout_centerInParent="true" - android:layout_alignParentRight="true" - android:layout_toRightOf="@id/image_list" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:scaleType="center" - android:clickable="true" - android:focusable="true" - android:src="@drawable/btn_ic_camera_shutter" - android:background="@drawable/btn_shutter"/> + <com.android.camera.ui.SettingsWheel android:id="@+id/settings_wheel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:layout_alignParentRight="true" + android:layout_toRightOf="@id/image_list"> + <com.android.camera.ShutterButton android:id="@+id/shutter_button" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:scaleType="center" + android:clickable="true" + android:focusable="true" + android:src="@drawable/btn_ic_camera_shutter" + android:background="@drawable/btn_shutter" /> + </com.android.camera.ui.SettingsWheel> <LinearLayout android:id="@+id/camera_switch_set" android:orientation="vertical" android:gravity="center" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" - android:layout_toRightOf="@id/image_list" android:layout_height="wrap_content" - android:layout_width="wrap_content"> + android:layout_width="wrap_content" + android:layout_marginRight="17dp"> <com.android.camera.RotateImageView android:id="@+id/video_switch_icon" android:layout_height="wrap_content" android:layout_width="wrap_content" diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index aecb386..2a974bd 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -21,6 +21,7 @@ import com.android.camera.gallery.IImageList; import com.android.camera.ui.CameraHeadUpDisplay; import com.android.camera.ui.GLRootView; import com.android.camera.ui.HeadUpDisplay; +import com.android.camera.ui.SettingsWheel; import com.android.camera.ui.ZoomControllerListener; import android.app.Activity; @@ -238,6 +239,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, private final Handler mHandler = new MainHandler(); private CameraHeadUpDisplay mHeadUpDisplay; + private SettingsWheel mSettingsWheel; // multiple cameras support private int mNumberOfCameras; @@ -349,6 +351,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, mHeadUpDisplay = new CameraHeadUpDisplay(this); mHeadUpDisplay.setListener(new MyHeadUpDisplayListener()); initializeHeadUpDisplay(); + initializeSettingsWheel(); mFirstTimeInitialized = true; changeHeadUpDisplayState(); addIdleHandler(); @@ -1070,6 +1073,16 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, } } + private void initializeSettingsWheel() { + mSettingsWheel = (SettingsWheel) findViewById(R.id.settings_wheel); + if (mSettingsWheel != null) { + CameraSettings settings = new CameraSettings(this, mInitialParams, + mCameraId, CameraHolder.instance().getCameraInfo()); + mSettingsWheel.initialize(this, + settings.getPreferenceGroup(R.xml.camera_preferences)); + } + } + private void initializeHeadUpDisplay() { CameraSettings settings = new CameraSettings(this, mInitialParams, mCameraId, CameraHolder.instance().getCameraInfo()); diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index 5c4e621..ed77165 100644 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -22,6 +22,7 @@ import com.android.camera.ui.CamcorderHeadUpDisplay; import com.android.camera.ui.GLRootView; import com.android.camera.ui.GLView; import com.android.camera.ui.HeadUpDisplay; +import com.android.camera.ui.SettingsWheel; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; @@ -137,6 +138,7 @@ public class VideoCamera extends NoSearchActivity private ImageView mVideoFrame; private GLRootView mGLRootView; private CamcorderHeadUpDisplay mHeadUpDisplay; + private SettingsWheel mSettingsWheel; private MenuItem mSwitchTimeLapseMenuItem; private boolean mIsVideoCaptureIntent; @@ -396,6 +398,7 @@ public class VideoCamera extends NoSearchActivity mHeadUpDisplay = new CamcorderHeadUpDisplay(this); mHeadUpDisplay.setListener(new MyHeadUpDisplayListener()); initializeHeadUpDisplay(); + initializeSettingsWheel(); } private void changeHeadUpDisplayState() { @@ -437,6 +440,16 @@ public class VideoCamera extends NoSearchActivity mGLRootView = null; } + private void initializeSettingsWheel() { + mSettingsWheel = (SettingsWheel) findViewById(R.id.settings_wheel); + if (mSettingsWheel != null) { + CameraSettings settings = new CameraSettings(this, mParameters, + mCameraId, CameraHolder.instance().getCameraInfo()); + mSettingsWheel.initialize(this, + settings.getPreferenceGroup(R.xml.video_preferences)); + } + } + @Override protected void onStart() { super.onStart(); diff --git a/src/com/android/camera/ui/SettingsWheel.java b/src/com/android/camera/ui/SettingsWheel.java new file mode 100644 index 0000000..7a94702 --- /dev/null +++ b/src/com/android/camera/ui/SettingsWheel.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2010 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.CameraSettings; +import com.android.camera.ComboPreferences; +import com.android.camera.IconListPreference; +import com.android.camera.PreferenceGroup; +import com.android.camera.R; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.widget.Button; +import android.view.ViewGroup; +import android.view.View; + +import java.lang.Math; + +/** + * A view that contains camera settings and shutter buttons. The settings are + * spreaded around the shutter button. + */ +public class SettingsWheel extends ViewGroup { + private static final String TAG = "SettingsWheel"; + private ComboPreferences mSharedPrefs; + private PreferenceGroup mPreferenceGroup; + + public SettingsWheel(Context context) { + super(context); + } + + public SettingsWheel(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SettingsWheel(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + // Measure all children. + int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + for (int i = 0; i < getChildCount(); i++) { + getChildAt(i).measure(freeSpec, freeSpec); + } + + // Measure myself. + View shutterButton = getChildAt(0); + int desiredWidth = (int)(shutterButton.getMeasuredWidth() * 2.5); + int desiredHeight = (int)(shutterButton.getMeasuredHeight() * 3); + int widthMode = MeasureSpec.getMode(widthSpec); + int heightMode = MeasureSpec.getMode(heightSpec); + int measuredWidth, measuredHeight; + if (widthMode == MeasureSpec.UNSPECIFIED) { + measuredWidth = desiredWidth; + } else if (widthMode == MeasureSpec.AT_MOST) { + measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec)); + } else { // MeasureSpec.EXACTLY + measuredWidth = MeasureSpec.getSize(widthSpec); + } + if (heightMode == MeasureSpec.UNSPECIFIED) { + measuredHeight = desiredHeight; + } else if (heightMode == MeasureSpec.AT_MOST) { + measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec)); + } else { // MeasureSpec.EXACTLY + measuredHeight = MeasureSpec.getSize(heightSpec); + } + setMeasuredDimension(measuredWidth, measuredHeight); + } + + @Override + protected void onLayout( + boolean changed, int left, int top, int right, int bottom) { + int count = getChildCount(); + if (count == 0) return; + + // Layout the shutter button. + View shutterButton = findViewById(R.id.shutter_button); + int width = shutterButton.getMeasuredWidth(); + int height = shutterButton.getMeasuredHeight(); + int xCenter = (right - left) - width / 2; + int yCenter = (bottom - top) / 2; + shutterButton.layout(xCenter - width / 2, yCenter - height / 2, + xCenter + width / 2, yCenter + height / 2); + + // Layout the settings. The icons are spreaded on the left side of the + // shutter button. So the angle starts from 90 to 270 degrees. + if (count == 1) return; + double radius = shutterButton.getMeasuredWidth(); + double intervalDegrees = 180.0 / (count - 2); + double initialDegrees = 90.0; + int index = 0; + for (int i = 0; i < count; ++i) { + View view = getChildAt(i); + if (view == shutterButton) continue; + double degree = initialDegrees + intervalDegrees * index; + double radian = degree * Math.PI / 180.0; + int x = xCenter + (int)(radius * Math.cos(radian)); + int y = yCenter - (int)(radius * Math.sin(radian)); + width = view.getMeasuredWidth(); + height = view.getMeasuredHeight(); + view.layout(x - width / 2, y - height / 2, x + width / 2, + y + height / 2); + index++; + } + } + + protected void addIndicator( + Context context, PreferenceGroup group, String key) { + IconListPreference pref = (IconListPreference) group.findPreference(key); + if (pref == null) return; + int index = pref.findIndexOfValue(pref.getValue()); + Button b = new Button(context); + b.setBackgroundResource(pref.getLargeIconIds()[index]); + addView(b); + } + + public void initialize(Context context, PreferenceGroup group) { + mPreferenceGroup = group; + mSharedPrefs = ComboPreferences.get(context); + addIndicator(context, group, CameraSettings.KEY_FLASH_MODE); + addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE); + addIndicator(context, group, CameraSettings.KEY_RECORD_LOCATION); + addIndicator(context, group, CameraSettings.KEY_CAMERA_ID); + requestLayout(); + } +} |