Hadak Tan
Hadak Tan

Reputation: 145

Countdown progress bar in Android Studio

I'm trying to make a countdown timer in form of a progress bar, and that's what i tried so far: but it don't work at all.

Layout XML File:

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    tools:context=".thetest">

    <ProgressBar
        android:id="@+id/progressBarToday"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="79dp"
        android:layout_height="101dp"
        android:layout_centerInParent="true"
        android:indeterminate="false"
        android:max="30"
        android:progress="29"
        android:progressDrawable="@drawable/circular_progress_bar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Java:

public class thetest extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_thetest);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressBarToday);

        Animation an = new RotateAnimation(0.0f, 90.0f, 250f, 273f);
        an.setFillAfter(true);
        pb.startAnimation(an);
    }
}

And finally the drawable style file(not sure if it might help but yeah):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/progress">
        <shape
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="7.0"
            android:useLevel="true">
            <gradient
                android:startColor="#fb0000"
                android:endColor="#00FF00"
                android:centerColor="#fbf400"
                android:type="sweep" />
        </shape>
    </item>
</layer-list>

Upvotes: 2

Views: 2218

Answers (2)

Hadak Tan
Hadak Tan

Reputation: 145

I found the solution:

Xml:

<ProgressBar
    android:id="@+id/progressbar"
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

Java code:

public class thetest extends AppCompatActivity {
ProgressBar mProgressBar;
CountDownTimer mCountDownTimer;
int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_thetest);
    mProgressBar=findViewById(R.id.progressbar);
    mProgressBar.setProgress(i);
    mCountDownTimer=new CountDownTimer(30000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished);
            i++;
            mProgressBar.setProgress((int)i*100/(30000/1000));

        }

        @Override
        public void onFinish() {
            //Do what you want
            i++;
            mProgressBar.setProgress(100);
        }
    };
    mCountDownTimer.start();
}

}

Upvotes: 1

cgb_pandey
cgb_pandey

Reputation: 1025

Rather than using animation to get a countdown timer, you can programmatically set the countdown time length as maximum progress of ProgressBar, and use a Handler object scheduled to run every second, to update the current progress of the ProgressBar as shown below:

        final ProgressBar pb = findViewById(R.id.progressBarToday);

        // for eg: if countdown is to go for 30 seconds
        pb.setMax(30);

        // the progress in our progressbar decreases with the decrement 
        // in the remaining time for countdown to be over
        pb.setProgress(30);

        // keep track of current progress
        final int[] currentProgress = {30};
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                currentProgress[0] -= 1;
                pb.setProgress(currentProgress[0]);
                if(currentProgress[0] != 0){
                    new Handler().postDelayed(this, 1000);
                }else
                    Toast.makeText(requireContext(), "Count Down is OVER!!", Toast.LENGTH_LONG).show();
            }
        }, 1000);

Upvotes: 0

Related Questions