我设置循环进度条(从0到100)以显示时间运行进度(从1:00到0:00)。当时间为1:00时,进度必须为0,当时间为0:00时,进度必须为100。
<ImageView
android:layout_width="@dimen/_56sdp"
android:layout_height="@dimen/_56sdp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/_2sdp"
android:src="@drawable/a_circular_black" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="@dimen/_56sdp"
android:layout_height="@dimen/_56sdp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/_2sdp"
android:max="100"
android:progress="26" //I set the progress 26 to show what it will be look like. Normally for 1:00 the progress must be 0.
android:progressDrawable="@drawable/a_circular" />
<TextView
android:id="@+id/textViewTimer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/_17sdp"
android:text="1:00"
android:textColor="#000000"
android:textSize="@dimen/_18sdp"
android:textStyle="bold" />
这是进度条背景:
<?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="270"
android:pivotX="50%"
android:pivotY="50%" >
<shape
android:innerRadiusRatio="2.5"
android:shape="ring"
android:thickness="@dimen/_3sdp" >
<size android:width="@dimen/_56sdp" android:height="@dimen/_56sdp" />
<gradient
android:centerColor="#FFA708"
android:endColor="#FFA708"
android:startColor="#FFA708"
android:type="sweep" />
</shape>
</rotate>
</item>
</layer-list>
这是图像背景:
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="60dp"
android:height="60dp" />
<stroke
android:width="3dp"
android:color="#ccc" />
<padding
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270">
<shape
android:shape="oval">
<size
android:width="60dp"
android:height="60dp" />
<gradient
android:centerColor="#000"
android:endColor="#000"
android:startColor="#000"
android:type="sweep" />
<padding
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp" />
</shape>
</rotate>
</item>
<item>
<shape android:shape="oval">
<size
android:width="60dp"
android:height="60dp" />
<solid android:color="#ccc" />
</shape>
</item>
</layer-list>.
因此,在我的布局预览中,它显示如下:
在我的onCreate
我设置进度0
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setProgress(0);
然后,当我的时间在它的线程中运行时,计时器自动更新:
private class TimeRun implements Runnable {
@Override
public void run() {
while (timeLeft > 0) {
try {
Thread.sleep(100);
timeLeft = timeLeft - 100;
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
if (timeLeft < 10000)
textViewTimer.setText("0:0" + timeLeft / 1000);
else
textViewTimer.setText("0:" + timeLeft / 1000);
}
});
}
}
当我运行活动时,进度条显示100,认为它应该是0(黑色圆圈)。它在运行时间内没有变化。文本视图正常更新,但进度条显示没有更改。 日志显示进度正在更新,但图形上没有更改。
我尝试通过发布Runnable来更新它,我也检查了这个问题,但答案对我没有帮助
android progressBar does not update progress view/drawable
你能建议我解决吗?
答案 0 :(得分:1)
看看这个解决方案。有效。 http://demonuts.com/2017/01/02/android-circular-progress-bar-percentage/ 这是由于你的进度条背景。
答案 1 :(得分:0)
您应该使用CountDownTimer
代替,这比使用线程更容易:
// here your total time is 1 minute = 1 * 60 * 1000 ms
// and ticks time is 1 sec = 1000 ms
new CountDownTimer(1 * 60 * 1000, 1000) {
public void onTick(long millisUntilFinished) {
// this will be alled in interval of 1 sec
// here you can have your logic to update progressBar or textbar
}
public void onFinish() {
// this will be called when timer will be fixished - afetr 1 min
// here you can have your logic to update progressBar to 0 again
}
}.start();
如果它仍然不适合你,那么你应该在更新ProgressBar时使用Synchized(),因为我遇到了同样的问题,这解决了这个问题:
synchronized (this) {
progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
}
或
synchronized (YourActivity.this) {
progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
}
答案 2 :(得分:0)
试试这个
runOnUiThread(new Runnable() {
@Override
public void run() {
Integer value = 100 - (int) ((double) timeLeft / ((double) 60000) * 100);
progressBar.setProgress(value);
if (timeLeft < 10000)
textViewTimer.setText("0:0" + timeLeft / 1000);
else
textViewTimer.setText("0:" + timeLeft / 1000);
}
});
答案 3 :(得分:0)
只需使用水平进度条样式并使用圆形可绘制。
style="?android:attr/progressBarStyleHorizontal"
android:progressDrawable="@drawable/circular_progress"