마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

타이머에서 프로그래스 바 애니메이션이 동작을 안합니다.

0 추천

타이머를 구현하고 싶어서 원형 프로그래스바로 타이머를 구현할려고 했는데, 애니메이션이 정상적으로 동작을 안하네요. 

public class TimerActivity extends AppCompatActivity {
    private ProgressBar pbTimer;
    private TextView txtRemainTime;
    private CountDownTimer countDownTimer;

    private int restTime;
    private int remainTime;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);
        pbTimer = findViewById(R.id.pbTimer);
        txtRemainTime = findViewById(R.id.txtRemainingTime);

        /** DB에서 휴식시간 받아와서 restTime에 할당 필요 */
        restTime = 8;  // 1000은 1초

        startTimer(restTime,pbTimer);
    }

    /** btnFinish 이벤트 리스너 */
    public void finishButtonClick(View view){
        Intent intent = new Intent(TimerActivity.this,SelectExercise.class);
        startActivity(intent);
        finish();
    }

    /** btnPlus 이벤트 리스너 */
    public void onPlusClick(View view){
        restTime = remainTime + 11;
        countDownTimer.cancel();
        startTimer(restTime,pbTimer);
    }

    /** btnMinus 이벤트 리스너 */
    public void onMinusClick(View view) {
        if (restTime > 10) {
            restTime = remainTime - 9;
            countDownTimer.cancel(); // 기존 타이머 취소
            startTimer(restTime,pbTimer);
        } else {
            restTime = 1;
            countDownTimer.cancel();
            startTimer(restTime,pbTimer);
        }
    }

    public int getRemainTime(int remainTime){
        return remainTime;
    }

    /** 타이머 설정 메소드 */
    private void startTimer(final int restTime,ProgressBar progressBar){

        if(countDownTimer != null){
            countDownTimer.cancel();
        }


        countDownTimer = new CountDownTimer(restTime * 1000, 1000){
            @Override
            public void onTick(long millisUntilFinished){
                int progress = restTime - (int) (millisUntilFinished / 1000); // 프로그레스바를 위한 값 계산
                progressBar.setProgress(progress);
                progressBar.setSecondaryProgress(progress + 1);
                String timeLeft = String.format("%02d:%02d",
                        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) -
                                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
                        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
                txtRemainTime.setText(timeLeft);

                remainTime = (int)TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
                getRemainTime(remainTime);

                progressBar.setMax(restTime);
                progressBar.setProgress(0);
                progressBar.setSecondaryProgress(0);
                ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", restTime);
                animation.setDuration(restTime * 1000);
                animation.setInterpolator(new LinearInterpolator());
                animation.start();

            }
            @Override
            public void onFinish(){
                txtRemainTime.setTextColor(Color.RED);
//                알림음 코드... R.raw에 파일을 추가해야함
//                MediaPlayer mediaPlayer = MediaPlayer.create(TimerActivity.this,R.raw.alarmsound);
//                mediaPlayer.start();
                Drawable progressDrawable = ContextCompat.getDrawable(TimerActivity.this, R.drawable.timer_progressbar_finished);

                pbTimer.setProgressDrawable(progressDrawable);
                pbTimer.invalidate();

                /** 타이머가 종료되고 1초뒤에 자동으로 Intent 실행 */
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(TimerActivity.this,SelectExercise.class);
                        startActivity(intent);
                        finish();
                    }
                },1000);
            }
        }.start();

        countDownTimer.start();
    }

}

진행된 시간만큼 프로그래스바 애니메이션으로 보여주고 싶은데 애니메이션이 동작을 안합니다.
btnPlus를 누르면 10초만큼 시간을 늘고, btnMinus를 누르면 시간이 10초만큼 줄어듭니다.
다른 부분은 정상적으로 동작하는데 애니메이션만 동작을 안하네요.
문제점이 뭔지 알려주시면 감사하겠습니다.

 

<ProgressBar
        android:id="@+id/pbTimer"
        style="@style/TimerProgressBar"
        android:layout_width="350dp"
        android:layout_height="350dp"
        android:layout_marginTop="100dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/timer_progressbar"
        android:backgroundTint="@color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

XML 코드입니다.

아아학살자 (180 포인트) 님이 2023년 5월 12일 질문

1개의 답변

+1 추천
 
채택된 답변
ProgressBar에는 ObjetAnimator 대신에 ValueAminator를 사용하셔야 하는 것 같네요. ValueAnimator에 리스너를 달고 리스너 안에서 프로그레스를 업데이트 하시면 될 것 같습니다.
타이머가 진행될 때 프로그레스바의 진행상태를 유지하기 위해서는 onTick메소드 안에서 ValueAnimator를 생성하거나 초기화 하지 말고 타이머 실행전에 초기화하고 inTick메소드에서는 ValueAnimator의 값만 업데이트 해주어야 할 것 같습니다.

그리고 특별한 애니메이션이 필요한 것이 아니라 단순히 진행상태만을 보여주기 위한 목적이라면 Timer의 interval의 1초보다 작게 해서 progress 값만 업데이트 해 주셔도 같은 효과를 얻을 수 있을 것 같아 보입니다. restTime = 100으로 해서 1씩 증가하도록 할 수도 있을 것 같구요. 그리고 Handler을 사용하셔도 동일한 효과를 줄 수 있을 것 같습니다.
spark (227,510 포인트) 님이 2023년 5월 13일 답변
아아학살자님이 2023년 5월 20일 채택됨
...