android 中的饼图进度条
Pie Progress Bar in android
嗨,我想在 android 中制作一个饼图进度条,就像所附的图片一样..
我已经完成了以下代码,但没有收获。enter link description here
所以我决定编写自己的 ProgressBarView。这是我的示例代码..
public class PieProgressView extends View {
private float mProgress;
private int MAX_ANGLE = 360;
public PieProgressView(Context context) {
super(context);
}
public PieProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PieProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawOval(canvas);
}
public void setProgress(int progress){
mProgress = (float) ((float)progress*3.6);
invalidate();
}
private void drawOval(Canvas canvas){
canvas.drawColor(Color.CYAN);
Paint paint = new Paint();
// smooths
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
RectF oval2 = new RectF(50, 50, 500, 500);
canvas.drawOval(oval2, paint);// opacity
Paint p = new Paint();
p.setColor(Color.BLACK);
canvas.drawArc(oval2, 270, mProgress, true, p);
System.out.println("drawOval Progress == "+mProgress);
//p.setAlpha(0x80); //
}
}
和 activity class 我称之为..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
pieProgressView = (PieProgressView)findViewById(R.id.pieprogress);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fillProgress();
}
});
}
private void fillProgress(){
for(int i=0;i<100 ; i++) {
pieProgressView.setProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在在这个 for 循环期间没有显示任何进度,但是在 for 循环完成后它将显示进度条,就像附图中显示黑色进度一样。
谁能告诉我这段代码有什么问题。为什么此代码不进行持续更新?
Thread.sleep( )
导致 UI 线程阻塞,因此您会在线程唤醒时看到 "filled" 饼图。我更改了代码以使用 CountDownTimer
代替,它就像一个魅力。这是代码:
public class MainActivity extends AppCompatActivity {
PieProgressView pie;
CountDownTimer timer;
int progress = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pie = (PieProgressView) findViewById(R.id.pie);
scheduleNextTimer();
}
private CountDownTimer getTimer(){
return new CountDownTimer(1000,1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
Log.d("PROG",progress + "");
pie.setProgress( progress++ );
scheduleNextTimer();
}
};
}
private void scheduleNextTimer(){
if( progress < 100 ){
timer = getTimer();
timer.start();
}
}
}
我喜欢
<ProgressBar
android:id="@+id/pr_progress_in_circle"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="24dp"
android:layout_height="24dp"
android:indeterminate="false"
android:max="100"
android:progress="60"
android:progressDrawable="@drawable/progress"
android:rotation="-90" />
其中 progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="@dimen/dimen_2"
android:left="@dimen/dimen_2"
android:right="@dimen/dimen_2"
android:top="@dimen/dimen_2">
<shape android:shape="oval">
<solid android:color="@color/grey_lighter" />
<stroke android:color="@android:color/transparent" />
</shape>
</item>
<item>
<shape
android:innerRadiusRatio="100"
android:shape="ring"
android:thicknessRatio="2.5"
android:useLevel="true">
<gradient
android:centerColor="@color/orange_above_avg"
android:endColor="@color/orange_above_avg"
android:startColor="@color/orange_above_avg"
android:type="sweep"
android:useLevel="false" />
</shape>
</item>
</layer-list>
您可以通过
进行测试
mProgressBar.setMax(totalQuestions);
mProgressBar.setProgress(correctQuestion);
或选择 this library
尝试使用此代码片段作为可绘制的进度:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp">
<shape android:shape="oval">
<solid android:color="@color/transparent" />
</shape>
</item>
<item android:id="@android:id/progress">
<shape
android:innerRadiusRatio="100"
android:shape="ring"
android:thicknessRatio="2.5"
android:useLevel="true">
<solid
android:color="@color/dark_black_half_transparent"
android:useLevel="false" />
</shape>
</item>
</layer-list>
您可以通过此更改顺时针或逆时针播放进度:
android:scaleX="-1"
您布局中的进度条应该是这样的:
<ProgressBar
android:id="@+id/progressbar"
style="?android:progressBarStyleHorizontal"
android:layout_width="60dp"
android:layout_height="60dp"
android:progress="@{viewModel.progressUpload}"
android:max="100"
android:rotation="90"
android:scaleX="-1"
android:progressDrawable="@drawable/custom_progressbar_drawable"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
嗨,我想在 android 中制作一个饼图进度条,就像所附的图片一样..
我已经完成了以下代码,但没有收获。enter link description here
所以我决定编写自己的 ProgressBarView。这是我的示例代码..
public class PieProgressView extends View {
private float mProgress;
private int MAX_ANGLE = 360;
public PieProgressView(Context context) {
super(context);
}
public PieProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PieProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawOval(canvas);
}
public void setProgress(int progress){
mProgress = (float) ((float)progress*3.6);
invalidate();
}
private void drawOval(Canvas canvas){
canvas.drawColor(Color.CYAN);
Paint paint = new Paint();
// smooths
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
RectF oval2 = new RectF(50, 50, 500, 500);
canvas.drawOval(oval2, paint);// opacity
Paint p = new Paint();
p.setColor(Color.BLACK);
canvas.drawArc(oval2, 270, mProgress, true, p);
System.out.println("drawOval Progress == "+mProgress);
//p.setAlpha(0x80); //
}
}
和 activity class 我称之为..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
pieProgressView = (PieProgressView)findViewById(R.id.pieprogress);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fillProgress();
}
});
}
private void fillProgress(){
for(int i=0;i<100 ; i++) {
pieProgressView.setProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在在这个 for 循环期间没有显示任何进度,但是在 for 循环完成后它将显示进度条,就像附图中显示黑色进度一样。
谁能告诉我这段代码有什么问题。为什么此代码不进行持续更新?
Thread.sleep( )
导致 UI 线程阻塞,因此您会在线程唤醒时看到 "filled" 饼图。我更改了代码以使用 CountDownTimer
代替,它就像一个魅力。这是代码:
public class MainActivity extends AppCompatActivity {
PieProgressView pie;
CountDownTimer timer;
int progress = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pie = (PieProgressView) findViewById(R.id.pie);
scheduleNextTimer();
}
private CountDownTimer getTimer(){
return new CountDownTimer(1000,1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
Log.d("PROG",progress + "");
pie.setProgress( progress++ );
scheduleNextTimer();
}
};
}
private void scheduleNextTimer(){
if( progress < 100 ){
timer = getTimer();
timer.start();
}
}
}
我喜欢
<ProgressBar
android:id="@+id/pr_progress_in_circle"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="24dp"
android:layout_height="24dp"
android:indeterminate="false"
android:max="100"
android:progress="60"
android:progressDrawable="@drawable/progress"
android:rotation="-90" />
其中 progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="@dimen/dimen_2"
android:left="@dimen/dimen_2"
android:right="@dimen/dimen_2"
android:top="@dimen/dimen_2">
<shape android:shape="oval">
<solid android:color="@color/grey_lighter" />
<stroke android:color="@android:color/transparent" />
</shape>
</item>
<item>
<shape
android:innerRadiusRatio="100"
android:shape="ring"
android:thicknessRatio="2.5"
android:useLevel="true">
<gradient
android:centerColor="@color/orange_above_avg"
android:endColor="@color/orange_above_avg"
android:startColor="@color/orange_above_avg"
android:type="sweep"
android:useLevel="false" />
</shape>
</item>
</layer-list>
您可以通过
进行测试 mProgressBar.setMax(totalQuestions);
mProgressBar.setProgress(correctQuestion);
或选择 this library
尝试使用此代码片段作为可绘制的进度:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp">
<shape android:shape="oval">
<solid android:color="@color/transparent" />
</shape>
</item>
<item android:id="@android:id/progress">
<shape
android:innerRadiusRatio="100"
android:shape="ring"
android:thicknessRatio="2.5"
android:useLevel="true">
<solid
android:color="@color/dark_black_half_transparent"
android:useLevel="false" />
</shape>
</item>
</layer-list>
您可以通过此更改顺时针或逆时针播放进度:
android:scaleX="-1"
您布局中的进度条应该是这样的:
<ProgressBar
android:id="@+id/progressbar"
style="?android:progressBarStyleHorizontal"
android:layout_width="60dp"
android:layout_height="60dp"
android:progress="@{viewModel.progressUpload}"
android:max="100"
android:rotation="90"
android:scaleX="-1"
android:progressDrawable="@drawable/custom_progressbar_drawable"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />