我正在制作长曝光计算器,这允许用户输入当前的快门速度,选择EV(曝光值),然后点击计算以计算出等效曝光。
当前快门速度和所需的EV变化均可从旋转器中选择,如下所示: https://dl.dropboxusercontent.com/u/14064960/2013-04-17%2011.31.47.png
产生的等效曝光取决于两个变量。
例如:
当前快门速度:1/100 EV:+1 等效快门速度= 1/50
当前快门速度:1/100 EV:+2 等效快门速度= 1/25
我为所有变量制定出来的唯一方法是列出所有可能组合的 MASSIVE IF语句:
If shutter speed is 1/100 and EV is +2, then equivalent shutter speed is 1/25.
有20种不同的快门速度和10种不同的EV值,所以这将是IF的负载。
有人对如何做到这一点有更好的了解吗?
我不是在完整的代码之后,而是伪造的代码或者这样做的方式,所以我可以自己解决,谢谢。
非常感谢任何帮助!
修改 的
实现它的公式是,对于每个EV增量,快门速度必须加倍,但这很复杂,因为快门速度的格式会发生变化。
1 / 4000,1 / 2000,1 / 1000,1 / 500,1 / 250,1 / 125,1 / 60,1 / 30,1 / 15,1 / 8,1 / 4,1 / 2,1秒, 2秒,4秒,8秒,15秒,30秒,1分钟2分钟,4分钟,8分钟等
修改
请求的现有代码:
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:background="@drawable/fabricc"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ExpCalc" >
<ImageView
android:id="@+id/apertureexample"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:contentDescription="Aperture Example Image"
android:padding="5dp"
android:adjustViewBounds="true"
android:src="@drawable/longexpcalc" />
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="10dp"
android:text="Current Shutter Speed:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/Locationspinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:entries="@array/shutterspeeds_array"
android:padding="10dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout04"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp" >
<LinearLayout
android:id="@+id/LinearLayout0f4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1" >
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="10dp"
android:text="EV Adjustment:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView1233"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="2dp"
android:text="(+6 = 6-stop ND Filter)"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<Spinner
android:id="@+id/evLocationspinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:entries="@array/ev_array"
android:padding="10dp" />
</LinearLayout>
<Button
android:id="@+id/CalculateEquivExposure"
style="@style/sub_menu"
android:background="@drawable/blue_menu_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="Calculate Equivelent Exposure" />
<TextView
android:id="@+id/equivexp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="40dp"
android:textSize="35sp"
android:text="1/8000" />
</LinearLayout>
爪哇:
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
public class ExpCalc extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expcalc);
// Show the Up button in the action bar.
setupActionBar();
}
//Sets up Action Bar
private void setupActionBar() {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.home, menu);
return true;
}
public boolean onPrepareOptionsMenu(Menu menu) {
return super.onPrepareOptionsMenu(menu);
}
//Sets up buttons in the quick menu
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
if (item.getItemId() == R.id.LessonsTutorials) {
startActivity(new Intent(this, Lessons.class));
}
if (item.getItemId() == R.id.PhotoTools) {
startActivity(new Intent(this, Tools.class));
}
if (item.getItemId() == R.id.Glossary) {
startActivity(new Intent(this, Glossary.class));
}
if (item.getItemId() == R.id.Help) {
startActivity(new Intent(this, Help.class));
}
return super.onOptionsItemSelected(item);
}
}
字符串数组:
<string-array name="shutterspeeds_array">
<item>1/8000</item>
<item>1/4000</item>
<item>1/2000</item>
<item>1/1000</item>
<item>1/500</item>
<item>1/250</item>
<item>1/125</item>
<item>1/60</item>
<item>1/30</item>
<item>1/15</item>
<item>1/8</item>
<item>1/4</item>
<item>1/2</item>
<item>1 sec</item>
<item>2 sec</item>
<item>4 sec</item>
<item>8 sec</item>
<item>15 sec</item>
<item>30 sec</item>
<item>1 min</item>
</string-array>
<string-array name="ev_array">
<item>0</item>
<item>+1</item>
<item>+2</item>
<item>+3</item>
<item>+4</item>
<item>+5</item>
<item>+6</item>
<item>+7</item>
<item>+8</item>
<item>+9</item>
<item>+10</item>
</string-array>
答案 0 :(得分:3)
我不想提供完整的代码来复制,因为如果你是为学校项目做这件事,我宁愿帮助你在我们的帮助下找到答案。
这是一个非常简单的解决方案:
由于您只需要这些精确值,因此您可以使用增加String数组中的计数器。此解决方案仅在有明确的最大快门速度时才有效。
String[] shutterSpeedValues={"1/4000", "1/2000", etc. }
然后,您可以设置第一个微调器的SpinnerAdapter以使用此Array。
对于第二个微调器,只需执行相同的操作,但将[0]映射为0,将[1]映射到+1等。
所以你最终得到:
shutterSpeedValues[]
eVValues[]
当用户按下Calculate按钮时,在Spinner中获取所选值的项ID。你最终得到了
shutterSpeedItemId="3"
evValueItemId="4"
这将对应于选择“1/500”和“+4”
的用户现在你要做的是:
int eqExposureItemId = shutterSpeedItemId+evValueItemId;
String eqExposure = shutterSpeedValues[eqExposureItemId];
mySolutionTextView.setText(eqExposure);
4 + 3 = 7 - &gt; 1/30
你仍然需要的是两个Spinners中高值的解决方案(不要得到ArrayOutOfBoundsError)。有一些修复,但尝试让它首先像这样工作。
编辑:以下是此解决方案的完整代码。
<强>活动强>
package com.yallatschikowski.exposurecalculator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
public class ExposureCalculatorActivity extends Activity {
Spinner shutterSpinner;
Spinner evSpinner;
String[] shutterValues;
String[] evValues;
Button calcButton;
TextView resultTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exposure_calculator);
// connect the variables to the layout
shutterSpinner = (Spinner) findViewById(R.id.shutterSpinner);
evSpinner = (Spinner) findViewById(R.id.evSpinner);
shutterValues = getResources().getStringArray(
R.array.shutterspeeds_array);
evValues = getResources().getStringArray(R.array.ev_array);
calcButton = (Button) findViewById(R.id.calcBT);
resultTextView = (TextView) findViewById(R.id.resultTV);
addItemsOnSpinner();
addListenerOnButton();
}
private void addListenerOnButton() {
calcButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int resultID = calculatExposure();
// check if the resultID is too big
if (resultID < shutterValues.length) {
resultTextView.setText(shutterValues[resultID]);
} else {
resultTextView.setText("Value > 1min");
}
}
});
}
protected int calculatExposure() {
long shutterID = shutterSpinner.getSelectedItemId();
long evID = evSpinner.getSelectedItemId();
return (int) (shutterID + evID);
}
private void addItemsOnSpinner() {
ArrayAdapter<String> shutterAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, shutterValues);
shutterAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
shutterSpinner.setAdapter(shutterAdapter);
ArrayAdapter<String> evAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, evValues);
evAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
evSpinner.setAdapter(evAdapter);
}
}
我也在布局中更改了一些内容(主要是ID),将其发布为完整
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:background="@color/grey"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ExpCalc" >
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="5dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Current Shutter Speed:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/shutterSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout04"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="5dp" >
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="EV Adjustment:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/evSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:gravity="right"
android:padding="10dp" />
</LinearLayout>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:text="(+6 = 6-stop ND Filter)"
android:textAppearance="?android:attr/textAppearanceSmall" />
<Button
android:id="@+id/calcBT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="Calculate Equivelent Exposure" />
<TextView
android:id="@+id/resultTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="40dp"
android:textSize="35sp"
/>
</LinearLayout>
答案 1 :(得分:1)
将快门速度存储在列表中。
获取正确快门速度的索引。
将您的EV值添加到索引中。
在新索引处从列表中拉出正确的速度。
因人而异
答案 2 :(得分:0)
你考虑过一张桌子吗?
currentShutterSpeed = table[evID][eqShutterSpeedID];
其中和是与表中的索引相对应的ID。
答案 3 :(得分:0)
如果您想考虑将数据集存储在数据库中的替代方案,那么sqllite就是Android的答案。为了不将教程复制粘贴到站点中,这里有一个很好的指南链接,可用于实现一些基本的数据库访问:
http://www.vogella.com/articles/AndroidSQLite/article.html
希望这有助于您不能只计算价值。我知道有公式,但有时您使用标准表中的舍入或近似值,并且在某些数据库上使用表可能更容易。
此致
答案 4 :(得分:0)
嵌套开关语句可以减少你的if else梯形图。就像当前快门速度的开关盒一样,然后在这种情况下切换等效快门速度。
答案 5 :(得分:0)
您也可以尝试使用装饰器模式。这样,您可以向单个对象添加行为。所以你用EV装饰快门速度。更多信息here。