Индикатор выполнения обратного отсчета в Android Studio - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь сделать таймер обратного отсчета в виде индикатора выполнения, и это то, что я пробовал до сих пор: но он вообще не работает.

Макет XML Файл:

<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);
    }
}

И, наконец, файл стиля с возможностью рисования (не уверен, может ли это помочь, но да):

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

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Я нашел решение:

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 код:

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();
}

}
0 голосов
/ 27 мая 2020

Вместо использования анимации для получения таймера обратного отсчета вы можете программно установить продолжительность обратного отсчета как максимальный прогресс ProgressBar и использовать объект Handler, запускаемый каждую секунду, для обновления текущего хода ProgressBar, как показано ниже:

        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);
...