Barra di avanzamento circolare (per un conto alla rovescia)
-
20-12-2019 - |
Domanda
OK Quindi ho un timer di conto alla rovescia di 15 secondi che funziona perfettamente bene e mi piacerebbe fare una barra di progresso circolare personalizzata per quel timer.
Voglio creare un cerchio completo che ottiene "fette della torta (cerchio)" tolto mentre il timer scende fino a quando non c'è più un cerchio.
Preferirei fare le forme da me stesso che usare le immagini pre-fatte perché vorrei che la qualità sia buona su qualsiasi telefono.Come dovrei andare a riguardo?Grazie!
Soluzione
Ho trovato questo esempio molto buono: http:// mrigaen.blogspot.it/2013/12/Create-Circola-Progress-Bar-in-android.html
Così ho creato la mia barra di avanzamento in questo modo
<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" />
.
Quindi ho fatto una funzione per il conto alla rovescia dove:
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();
}
.
Aggiornamento
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();
}
. Altri suggerimenti
Per la creazione di componenti personalizzati, si prega di controllare Guida API Android .Estratto per approccio di base:
..
- Estendi una classe di visualizzazione esistente o una sottoclasse con la tua classe.
- Override alcuni dei metodi dalla superclass.I metodi superclasse per sovrascrivere iniziare con "on", ad esempio, ONDRAW (), onMeasure () e onkeydown ().Questo è simile al ... Eventi in Attività o elenco che si sovrascrive per il ciclo di vita e altro Ganci di funzionalità.
- Usa la tua nuova classe di estensione.Una volta completata, la nuova classe di estensione può essere utilizzata al posto della vista su cui era basata.
ANCHE, controlla la ruota di avanzamento di Todd Davies a https://github.com/todd-davies/progresswheel, questo dovrebbe iniziare.
Smooth Circle Progress Bar Timer
Layout XML:
attività_main
<?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>
.
File disegnato:
citrcleshape2_timervisciew
<?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="5"
android:shape="ring"
android:thicknessRatio="20.0"
android:useLevel="false"
android:visible="true">
<gradient
android:centerColor="#FF00"
android:endColor="#FF00"
android:startColor="#FF00ff"
android:type="sweep" />
</shape>
</item>
</layer-list>
.
Circleshape1_TIMERCIEW
<?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="5"
android:shape="ring"
android:thicknessRatio="20.0"
android:useLevel="true"
android:visible="true">
<gradient
android:centerColor="#FF00"
android:endColor="#FF00"
android:startColor="#FF00ff"
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>
.
Attività:
Maineactivity
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();
}
}
.