1

私は長時間露光計算機を作成しています。これにより、ユーザーは現在のシャッター速度を入力し、EV (露出値) を選択し、[計算] をクリックして同等の露出を計算できます。

ここで確認できるように、現在のシャッター速度と目的の EV 変更の両方がスピナーから選択されます 。

結果として得られる等価エクスポージャーは、2 つの変数に依存します。

例えば:

現在のシャッター速度: 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 の増分ごとにシャッター速度を 2 倍にする必要があるというものですが、シャッター速度の形式が変わるため、これは複雑です。

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>
4

6 に答える 6

3

コピーする完全なコードを提供したくありません。学校のプロジェクトでこれを行っている場合は、私たちの助けを借りて答えを開発するのを手伝いたいからです。

これは非常に簡単な解決策です:

必要なのはこれらの正確な値だけなので、文字列配列のカウンターをインクリメントして作業できます。このソリューションは、明確な最大シャッター速度がある場合にのみ機能します。

String[] shutterSpeedValues={"1/4000", "1/2000", etc. }

次に、この配列を使用するように最初のスピナーの SpinnerAdapter を設定できます。

2 番目のスピナーについても同じことを行いますが、[0] を 0 に、[1] を +1 などにマップします。

したがって、次のようになります。

shutterSpeedValues[]
eVValues[]

ユーザーが [計算] ボタンを押すと、スピナーで選択された値のアイテム ID が取得されます。あなたは例えばで終わる

shutterSpeedItemId="3"
evValueItemId="4"

これは、「1/500」と「+4」を選択したユーザーに対応します。

今あなたがすることは:

   int eqExposureItemId = shutterSpeedItemId+evValueItemId;
   String eqExposure = shutterSpeedValues[eqExposureItemId];
   mySolutionTextView.setText(eqExposure);

4+3=7 --> 1/30

あなたがまだ必要としているのは、両方のスピナーの高い値に対する解決策です (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>
于 2013-04-17T14:53:24.627 に答える
0

ネストされたスイッチ ステートメントは、if else ラダーを減らす方法の 1 つです。たとえば、現在のシャッター スピードのスイッチ ケースを使用し、その場合は同等のシャッター スピードのスイッチを使用します。

于 2013-04-17T13:58:06.003 に答える
0

テーブルについて考えたことはありますか?

currentShutterSpeed = table[evID][eqShutterSpeedID];

ここで、 と は、テーブルへのインデックスに対応する ID です。

于 2013-04-17T13:48:58.637 に答える