Круговой индикатор выполнения (для таймера обратного отсчета)
Итак, у меня есть таймер обратного отсчета в 15 секунд, который отлично работает, и я хотел бы создать настраиваемый круговой индикатор выполнения для этого таймера.
Я хочу создать полный круг, который получает "кусочки пирога (круга)", которые вынимаются, когда таймер идет вниз, пока не будет больше круга.
Я бы предпочел сам создавать фигуры, чем использовать предварительно созданные изображения, потому что я хотел бы, чтобы качество было хорошим на любом телефоне. Как я могу это сделать? Спасибо!
Ответы
Ответ 1
Я нашел этот пример очень хорошим: http://mrigaen.blogspot.it/2013/12/create-circular-progress-bar-in-android.html
Итак, я создал свой индикатор выполнения
<ProgressBar
android:id="@+id/barTimer"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:progressDrawable="@drawable/circular_progress_bar" />
Затем я сделал функцию для обратного отсчета, где:
private void startTimer(final int minuti) {
countDownTimer = new CountDownTimer(60 * minuti * 1000, 500) {
// 500 means, onTick function will be called at every 500 milliseconds
@Override
public void onTick(long leftTimeInMilliseconds) {
long seconds = leftTimeInMilliseconds / 1000;
int barVal= (barMax) - ((int)(seconds/60*100)+(int)(seconds%60));
barTimer.setProgress(barVal);
textTimer.setText(String.format("%02d", seconds/60) + ":" + String.format("%02d", seconds%60));
// format the textview to show the easily readable format
}
@Override
public void onFinish() {
if(textTimer.getText().equals("00:00")){
textTimer.setText("STOP");
}
else{
textTimer.setText("2:00");
}
}
}.start();
}
ОБНОВЛЕНИЕ
private void startTimer(final int minuti) {
countDownTimer = new CountDownTimer(60 * minuti * 1000, 500) {
// 500 means, onTick function will be called at every 500 milliseconds
@Override
public void onTick(long leftTimeInMilliseconds) {
long seconds = leftTimeInMilliseconds / 1000;
barTimer.setProgress((int)seconds);
textTimer.setText(String.format("%02d", seconds/60) + ":" + String.format("%02d", seconds%60));
// format the textview to show the easily readable format
}
@Override
public void onFinish() {
if(textTimer.getText().equals("00:00")){
textTimer.setText("STOP");
}
else{
textTimer.setText("2:00");
barTimer.setProgress(60*minuti);
}
}
}.start();
}
Ответ 2
Для создания пользовательских компонентов проверьте Руководство по API Android. Выдержка из базового подхода:
- Расширить существующий класс или подкласс класса с вашим собственным классом.
- Переопределить некоторые методы из суперкласса. Методы суперкласса для переопределения начинаются с 'on', например, onDraw(), onMeasure() и onKeyDown(). Это похоже на события... в Activity или ListActivity, которые вы переопределяете для жизненного цикла и других функциональные крючки.
- Используйте новый класс расширения. После завершения вашего нового класса расширения можно использовать вместо представления, на котором оно было основано.
Кроме того, проверьте ход хода Тодда Дэвиса на https://github.com/Todd-Davies/ProgressWheel, это должно помочь вам начать.
Ответ 3
**smooth circle progress bar timer**
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/reativelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<ProgressBar
android:id="@+id/progressbar_timerview"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="260dp"
android:layout_height="260dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_horizontal|bottom"
android:indeterminate="false"
android:progressDrawable="@drawable/circleshape2_timerview" />
<TextView
android:id="@+id/textView_timerview_time"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:alpha="0.6"
android:background="@drawable/circleshape_timerview"
android:gravity="center"
android:text="00:00"
android:textColor="@android:color/black"
android:textSize="20sp"
android:textStyle="bold" />
<ProgressBar
android:id="@+id/progressbar1_timerview"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="260dp"
android:layout_height="260dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_horizontal|center"
android:indeterminate="false"
android:progressDrawable="@drawable/circleshape1_timerview"
android:visibility="gone" />
<Button
android:id="@+id/button_timerview_start"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
android:text="Start !"
android:textAllCaps="false"
android:textSize="20sp"
android:textStyle="italic" />
<Button
android:id="@+id/button_timerview_stop"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
android:text="Stop !"
android:layout_marginTop="30dp"
android:textAllCaps="false"
android:textSize="20sp"
android:visibility="invisible"
android:textStyle="italic"
/>
<EditText
android:id="@+id/textview_timerview_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center"
android:padding="5dp"
android:layout_marginBottom="30dp"
android:textSize="35sp"
android:hint=""/>
</RelativeLayout>
***Tack the below drawable Folders***
circleshape2_timerview:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress">
<shape
android:innerRadiusRatio="500"
android:shape="ring"
android:thicknessRatio="3.0"
android:useLevel="false"
android:visible="true">
<gradient
android:centerColor="#FF00"
android:endColor="#FF00"
android:startColor="#FF00ff"
android:type="sweep" />
</shape>
</item>
</layer-list>
</layer-list>
circleshape1_timerview:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:toDegrees="-90">
<shape
android:innerRadiusRatio="460"
android:shape="ring"
android:thicknessRatio="3.0"
android:useLevel="true"
android:visible="true">
<gradient
android:centerColor="#FF00"
android:endColor="#FF00"
android:startColor="#FF00"
android:type="sweep" />
</shape>
</rotate>
</item>
</layer-list>
circleshape_timerview :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#bbb"/>
</shape>
</item>
</selector>
***MAIN CODE:***
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
int i = -1;
ProgressBar mProgressBar, mProgressBar1;
private Button buttonStartTime, buttonStopTime;
private EditText edtTimerValue;
private TextView textViewShowTime;
private CountDownTimer countDownTimer;
private long totalTimeCountInMilliseconds;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonStartTime = (Button) findViewById(R.id.button_timerview_start);
buttonStopTime = (Button) findViewById(R.id.button_timerview_stop);
textViewShowTime = (TextView)
findViewById(R.id.textView_timerview_time);
edtTimerValue = (EditText) findViewById(R.id.textview_timerview_back);
buttonStartTime.setOnClickListener(this);
buttonStopTime.setOnClickListener(this);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar_timerview);
mProgressBar1 = (ProgressBar) findViewById(R.id.progressbar1_timerview);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button_timerview_start) {
setTimer();
buttonStartTime.setVisibility(View.INVISIBLE);
buttonStopTime.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.INVISIBLE);
startTimer();
mProgressBar1.setVisibility(View.VISIBLE);
} else if (v.getId() == R.id.button_timerview_stop) {
countDownTimer.cancel();
countDownTimer.onFinish();
mProgressBar1.setVisibility(View.GONE);
mProgressBar.setVisibility(View.VISIBLE);
edtTimerValue.setVisibility(View.VISIBLE);
buttonStartTime.setVisibility(View.VISIBLE);
buttonStopTime.setVisibility(View.INVISIBLE);
}
}
private void setTimer(){
int time = 0;
if (!edtTimerValue.getText().toString().equals("")) {
time = Integer.parseInt(edtTimerValue.getText().toString());
} else
Toast.makeText(MainActivity.this, "Please Enter Minutes...",
Toast.LENGTH_LONG).show();
totalTimeCountInMilliseconds = time * 1000;
mProgressBar1.setMax( time * 1000);
}
private void startTimer() {
countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 1) {
@Override
public void onTick(long leftTimeInMilliseconds) {
long seconds = leftTimeInMilliseconds / 1000;
mProgressBar1.setProgress((int) (leftTimeInMilliseconds));
textViewShowTime.setText(String.format("%02d", seconds / 60)
+ ":" + String.format("%02d", seconds % 60));
}
@Override
public void onFinish() {
textViewShowTime.setText("00:00");
textViewShowTime.setVisibility(View.VISIBLE);
buttonStartTime.setVisibility(View.VISIBLE);
buttonStopTime.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar1.setVisibility(View.GONE);
}
}.start();
}
}