IF声明或其他我没有想到的东西?

时间:2013-04-17 13:43:49

标签: java android

我正在制作长曝光计算器,这允许用户输入当前的快门速度,选择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>

6 个答案:

答案 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)

  1. 将快门速度存储在列表中。

  2. 获取正确快门速度的索引。

  3. 将您的EV值添加到索引中。

  4. 在新索引处从列表中拉出正确的速度。

  5. 因人而异

答案 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