IndicatorControlWheel.java revision 6f2283fbf049ad1f9870a86474af295604d95600
16f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li/* 26f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project 36f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * 46f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 56f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * you may not use this file except in compliance with the License. 66f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * You may obtain a copy of the License at 76f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * 86f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 96f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * 106f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Unless required by applicable law or agreed to in writing, software 116f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 126f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * See the License for the specific language governing permissions and 146f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * limitations under the License. 156f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li */ 166f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 176f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Lipackage com.android.camera.ui; 186f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 196f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.CameraSettings; 206f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.ComboPreferences; 216f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.IconListPreference; 226f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.PreferenceGroup; 236f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.R; 246f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 256f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.content.Context; 266f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.util.AttributeSet; 276f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.util.Log; 286f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.widget.Button; 296f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.view.ViewGroup; 306f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.view.View; 316f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 326f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport java.lang.Math; 336f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 346f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li/** 356f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * A view that contains camera settings and shutter buttons. The settings are 366f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * spreaded around the shutter button. 376f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li */ 386f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Lipublic class SettingsWheel extends ViewGroup { 396f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li private static final String TAG = "SettingsWheel"; 406f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li private ComboPreferences mSharedPrefs; 416f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li private PreferenceGroup mPreferenceGroup; 426f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 436f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li public SettingsWheel(Context context) { 446f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li super(context); 456f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 466f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 476f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li public SettingsWheel(Context context, AttributeSet attrs) { 486f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li super(context, attrs); 496f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 506f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 516f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li public SettingsWheel(Context context, AttributeSet attrs, int defStyle) { 526f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li super(context, attrs, defStyle); 536f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 546f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 556f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li @Override 566f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li protected void onMeasure(int widthSpec, int heightSpec) { 576f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li // Measure all children. 586f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 596f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li for (int i = 0; i < getChildCount(); i++) { 606f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li getChildAt(i).measure(freeSpec, freeSpec); 616f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 626f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 636f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li // Measure myself. 646f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li View shutterButton = getChildAt(0); 656f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int desiredWidth = (int)(shutterButton.getMeasuredWidth() * 2.5); 666f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int desiredHeight = (int)(shutterButton.getMeasuredHeight() * 3); 676f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int widthMode = MeasureSpec.getMode(widthSpec); 686f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int heightMode = MeasureSpec.getMode(heightSpec); 696f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int measuredWidth, measuredHeight; 706f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (widthMode == MeasureSpec.UNSPECIFIED) { 716f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredWidth = desiredWidth; 726f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } else if (widthMode == MeasureSpec.AT_MOST) { 736f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec)); 746f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } else { // MeasureSpec.EXACTLY 756f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredWidth = MeasureSpec.getSize(widthSpec); 766f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 776f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (heightMode == MeasureSpec.UNSPECIFIED) { 786f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredHeight = desiredHeight; 796f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } else if (heightMode == MeasureSpec.AT_MOST) { 806f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec)); 816f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } else { // MeasureSpec.EXACTLY 826f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li measuredHeight = MeasureSpec.getSize(heightSpec); 836f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 846f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li setMeasuredDimension(measuredWidth, measuredHeight); 856f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 866f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 876f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li @Override 886f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li protected void onLayout( 896f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li boolean changed, int left, int top, int right, int bottom) { 906f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int count = getChildCount(); 916f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (count == 0) return; 926f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 936f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li // Layout the shutter button. 946f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li View shutterButton = findViewById(R.id.shutter_button); 956f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int width = shutterButton.getMeasuredWidth(); 966f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int height = shutterButton.getMeasuredHeight(); 976f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int xCenter = (right - left) - width / 2; 986f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int yCenter = (bottom - top) / 2; 996f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li shutterButton.layout(xCenter - width / 2, yCenter - height / 2, 1006f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li xCenter + width / 2, yCenter + height / 2); 1016f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 1026f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li // Layout the settings. The icons are spreaded on the left side of the 1036f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li // shutter button. So the angle starts from 90 to 270 degrees. 1046f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (count == 1) return; 1056f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li double radius = shutterButton.getMeasuredWidth(); 1066f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li double intervalDegrees = 180.0 / (count - 2); 1076f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li double initialDegrees = 90.0; 1086f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int index = 0; 1096f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li for (int i = 0; i < count; ++i) { 1106f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li View view = getChildAt(i); 1116f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (view == shutterButton) continue; 1126f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li double degree = initialDegrees + intervalDegrees * index; 1136f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li double radian = degree * Math.PI / 180.0; 1146f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int x = xCenter + (int)(radius * Math.cos(radian)); 1156f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int y = yCenter - (int)(radius * Math.sin(radian)); 1166f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li width = view.getMeasuredWidth(); 1176f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li height = view.getMeasuredHeight(); 1186f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li view.layout(x - width / 2, y - height / 2, x + width / 2, 1196f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li y + height / 2); 1206f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li index++; 1216f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 1226f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 1236f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 1246f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li protected void addIndicator( 1256f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li Context context, PreferenceGroup group, String key) { 1266f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li IconListPreference pref = (IconListPreference) group.findPreference(key); 1276f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li if (pref == null) return; 1286f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li int index = pref.findIndexOfValue(pref.getValue()); 1296f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li Button b = new Button(context); 1306f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li b.setBackgroundResource(pref.getLargeIconIds()[index]); 1316f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li addView(b); 1326f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 1336f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li 1346f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li public void initialize(Context context, PreferenceGroup group) { 1356f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li mPreferenceGroup = group; 1366f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li mSharedPrefs = ComboPreferences.get(context); 1376f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li addIndicator(context, group, CameraSettings.KEY_FLASH_MODE); 1386f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE); 1396f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li addIndicator(context, group, CameraSettings.KEY_RECORD_LOCATION); 1406f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li addIndicator(context, group, CameraSettings.KEY_CAMERA_ID); 1416f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li requestLayout(); 1426f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li } 1436f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li} 144