Aplikacja do biegów interwałowych - pomoc

0

Witam. Próbuję napisać w Android Studio aplikację do biegów interwałowych. No i mam problem z wymyśleniem algorytmu w pewnym stadium. Może najpierw omówię co program ma robić.
Bieg interwałowy polega na bieganiu ze zmiennym tempem, raz wolniej i raz szybciej. Program ma podpowiadać co aktualnie mamy robić, czy biegać szybkim, czy wolnym tempem - taki asystent.
W aplikacji podajemy czas rozgrzewki (czyli ile sekund marszujemy przed bieganiem), czas relaksu (ile sekund marszujemy po zakończeniu biegania), Hispeed (czyli ile sekund trwa jeden cykl szybkiego biegu), Lowspeed (czyli ile sekund trwa jeden cykl wolnego biegu) oraz liczbę cykli (szybki-wolny bieg).
Trening przedstawia poniższy rysunek.
user image

Okno programu.
user image
Po naciśnięciu START zaczynają się obliczenia. Całkowity czas treningu liczony jest OK, czas pozostały do końca też działa. Schody zaczynają się jak chcę aby textView8 zmieniało się na taki String, na jakim stadium aktualnie się znajdujemy (rozgrzewka, relaks, hispeed, lowspeed, koniec). Rozgrzewka, relaks i koniec zrobiłęm prostym działaniem, nie mogę jednak wymyślić algorytmu aby wraz z upływem czasy zmieniała się wartość textView8 na HiSpeed i LowSpeed, jest to trudne z tego względu że liczba cykli musi zostać uwzględniona.
Czy jest mi ktoś w stanie cokolwiek podpowiedzieć?
Jak już się z tym uporam dodatkowo w polu textView9 będzie odliczanie każdej czynności od wartości zadeklarowanej do 0, oraz przy odliczaniu HiSpeed wibrowanie i dźwięk co 500ms, a przy odliczaniu LowSpeed co 1000ms. Przyciski Cichy, WIbracje i Głośny też już działają.

public class MainActivity extends ActionBarActivity {

    int rozgrzewka, relaks, hispeed, lowspeed, cykle, overall;
    Button b1,b2,b3;
    AudioManager am;
    int count = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        b1=(Button)findViewById(R.id.button2);
        b2=(Button)findViewById(R.id.button3);
        b3=(Button)findViewById(R.id.button4);
        am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                am.setRingerMode(0);
            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                am.setRingerMode(1);
            }
        });
        b3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                am.setRingerMode(2);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    public void start(View view) {

        EditText editText = (EditText) findViewById(R.id.editText);
        rozgrzewka = Integer.parseInt(editText.getText().toString());
        EditText editText2 = (EditText) findViewById(R.id.editText2);
        relaks = Integer.parseInt(editText2.getText().toString());
        EditText editText3 = (EditText) findViewById(R.id.editText3);
        hispeed = Integer.parseInt(editText3.getText().toString());
        EditText editText4 = (EditText) findViewById(R.id.editText4);
        lowspeed = Integer.parseInt(editText4.getText().toString());
        EditText editText5 = (EditText) findViewById(R.id.editText5);
        cykle = Integer.parseInt(editText5.getText().toString());

        overall = rozgrzewka + relaks + ((hispeed + lowspeed) * cykle);
        TextView textView13 = (TextView) findViewById(R.id.textView13);
        textView13.setText("" + overall);


        final TextView textView12 = (TextView) findViewById(R.id.textView12);
        CountDownTimer Count = new CountDownTimer(overall * 1000, 1000) {

            public void onTick(long millisUntilFinished) {

                int seconds = (int) ((millisUntilFinished / 1000));

                textView12.setText("" + millisUntilFinished / 1000);

                int milis = (int) millisUntilFinished;

                if ((overall - (milis / 1000)) < rozgrzewka) {
                    TextView textView8 = (TextView) findViewById(R.id.textView8);
                    textView8.setText("Rozgrzewka");
                }
                if ((overall - (milis / 1000)) > (overall - relaks)) {
                    TextView textView8 = (TextView) findViewById(R.id.textView8);
                    textView8.setText("Relaks");
                }


            }
            public void onFinish() {

                textView12.setText("0");
                TextView textView8 = (TextView) findViewById(R.id.textView8);
                textView8.setText("Koniec");
            }
        };

        Count.start();

        }

    }
 
0

Nazywaj sensownie zmienne, po spojrzeniu na nazwę masz wiedzieć co w nich jest. textview8 to nie jest dobra nazwa.


Nie lepiej po prostu trzymać aktualną fazę treningu w zmiennej (np. jako enum) zamiast bawić się w jakieś dziwne obliczenia?

0

Skorzystaj z AlarmManagera któremu ustawisz interwał czasowy do zmieniania text view

0

Może mała pomoc w implementacji? :)

0

Napisz w czym masz problem i co już próbowałeś to pomożemy.

0

No właśnie nie potrafię ruszyć z tym, żeby textView8 zmieniało się na string HiSpeed lub LowSpeed zgodnie z tym, jaki akurat tryb jest wyliczony czasowo, uwzględniając liczbę cykli.
Tzn nie wiem jak to wyliczyć żeby działało :/
Powiedzmy wpisujemy:
Rozgrzewka 30s, Relaks 30s, Hispeed 60s, Lowspeed 60s, cykle 3.
TextView8 ma się zmieniać następująco: "Rozgrzewka" przez 30s, "HiSpeed" przed 60s, "Lowspeed" przez 60s, "HiSpeed" przed 60s, "Lowspeed" przez 60s, "HiSpeed" przed 60s, "Lowspeed" przez 60s, "Relaks" przez 30s i "Koniec".

0

No przecież napisałem ci już, dlaczego masz robić jakieś obliczenia? Przeczytaj jeszcze raz mój post.

Nie lepiej po prostu trzymać aktualną fazę treningu w zmiennej?

0

Tak, widziałem co napisałeś. Mimo wszystko nie wiem konkretnie jak to zrobić. Może rozwiniesz nieco swój zamysł? Jak by to miało wyglądać?

0

Tworzysz sobie przykładowo enum z wartościami ROZGRZEWKA, LOW_SPEED, w klasie zmienną z typem tego enuma, nazwijmy tą zmienną faza, w osobnych zmiennych trzymasz czas trwania tych faz treningowych. W timerze na końcu czasu każdej fazy zmieniasz wartość zmiennej faza na kolejną fazę treningu.

Oczywiście można to zrobić lepiej, ale raczej nic z tego nie wyjdzie.

0

A czy mógłbyś to pokazać w praktyce, kawałek kodu? Wiem że proszę o wiele, ale programowanie to nie jest moja mocna strona i nie mogę za chiny wymyślić ani znaleźć jak to napisać :/
Gdyby nie to że liczbę cykli podaje user to nie byłoby problemu, a tak jestem w kropce...

1 użytkowników online, w tym zalogowanych: 0, gości: 1