Как рассчитать процент ProgressBar для ежедневной питьевой воды - PullRequest
1 голос
/ 18 апреля 2020

Я сделал приложение о android мониторе питьевой воды. Но это делает неправильный расчет в процентах. Как вы думаете, я мог сделать неправильно. (Когда индикатор выполнения равен 100 на 100, ежедневный расчет воды неверен)

waterml = sharedPreferences.getInt(WATER_ML, 0);
waterdata = sharedPreferences.getInt(WATER_DATA, 0);
int dailywater = 2838; // example        
ml100.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       //scale 100 ml
        int percent = 100  * 100 / dailywater;
        ProgressBarAnimation anim = new ProgressBarAnimation(circlebar, waterdata, (waterdata + percent));
        anim.setDuration(300);
        circlebar.startAnimation(anim);
        dailywater.setText((waterml + 100) + " / " + dailywater + " ml");
        editor = sharedPreferences.edit();
        editor.putInt(WATER_DATA, (waterdata + percent));
        editor.putInt(WATER_ML, (waterml + 100));
        editor.apply();
    }
});
////
public static class ProgressBarAnimation extends Animation {
    private CircleProgressBar progressBar;
    private float from;
    private float to;
    ProgressBarAnimation(CircleProgressBar progressBar, float from, float to) {
        super();
        this.progressBar = progressBar;
        this.from = from;
        this.to = to;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        float value = from + (to - from) * interpolatedTime;
        progressBar.setProgress((int) value);
    }
}

1 Ответ

1 голос
/ 18 апреля 2020

Мне кажется, что ваш код, а именно editor.apply(); работает следующим образом:

вы пытаетесь сохранить прогресс, и иногда случается так, что он вызывается несколько раз подряд. Согласно документации , если вы отправляете несколько команд apply() или commit(), будет выполнена только последняя. Поэтому некоторые клики могут не обрабатываться.

Я предлагаю вам просто изменить переменную для прогресса и сохранить ее позже:

waterml = sharedPreferences.getInt(WATER_ML, 0);
waterdata = sharedPreferences.getInt(WATER_DATA, 0);
int dailywater = 2838; // example        
ml100.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //scale 100 ml
        int percent = 100  * 100 / dailywater;
        ProgressBarAnimation anim = new ProgressBarAnimation(circlebar, waterdata, (waterdata + percent));
        anim.setDuration(300);
        circlebar.startAnimation(anim);
        dailywater.setText((waterml + 100) + " / " + dailywater + " ml");

        waterdata += percent;
        waterml += 100;
    }
});

, а затем в вашей функции onPause() вы просто сохраните их :

public void onPause() {
    editor = sharedPreferences.edit();
    editor.putInt(WATER_DATA, waterdata);
    editor.putInt(WATER_ML, waterml);
    editor.apply();
}

Если вы хотите, чтобы ваш процент не округлялся, вы можете изменить putInt на putFloat и getInt на getFloat

...