【问题标题】:Pie Progress Bar in androidandroid中的馅饼进度条
【发布时间】:2016-01-20 06:39:42
【问题描述】:

您好,我想在 android 中制作一个 Pie 进度条,就像所附图片一样..

我已经通过以下代码但没有收获。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); //
}

}

我称之为活动类..

 @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 循环完成后,它会显示进度条,就像附件中的黑色进度一样。

谁能告诉我这段代码有什么问题。为什么这段代码不做持续更新?

【问题讨论】:

  • setProgress( ) 在没有循环的情况下是否可以正常工作?
  • @LittleChild 是的,它可以在没有循环的情况下工作,但是当我运行循环时,它只会在循环完成后更新。实际上,在我的应用程序中,我正在从服务器下载一些文件,并且我想以这种方式显示进度对话框。所以我使用for循环来不断更新视图。

标签: android view progress-bar


【解决方案1】:

我实现它就像

<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

【讨论】:

    【解决方案2】:

    Thread.sleep( ) 导致 UI 线程阻塞,因此当线程唤醒时您会看到“填充”饼图。我将代码更改为使用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();
            }
        }
    }
    

    【讨论】:

    • 您的解决方案运行良好 .. 这对我来说是一个冷酷的错误。非常感谢。
    【解决方案3】:

    尝试使用此代码 sn-p 作为进度可绘制对象:

    <?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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多