Как создать круговой индикатор выполнения (круговая диаграмма), как индикатор - Android - программирование
Подтвердить что ты не робот

Как создать круговой индикатор выполнения (круговая диаграмма), как индикатор - Android

Теперь у меня есть горизонтальный индикатор выполнения, который программно обновляется с помощью метода ProgressBar setProgress:

<ProgressBar
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:layout_width="0dip"
            android:layout_weight="1"
            android:layout_height="20dip"
            android:id="@+id/progressbar"
            >
    </ProgressBar>

Есть ли способ конвертировать этот индикатор выполнения в круг (круговая диаграмма), а также возможность обновления программного обеспечения программно?

Пример того, что я хочу:

4b9b3361

Ответ 1

Вы можете создать пользовательский вид (например, PieProgressView) или пользовательский Drawable (например, PieProgressDrawable). Я взял подход к пользовательскому представлению, но либо совершенно жизнеспособный.

Быстрый взгляд на источник для Android ProgressView дает невероятно сложную реализацию. Очевидно, они покрывают все их базы, но вам не нужно писать что-то такое сложное. Нам действительно нужны только две вещи:

  • Член, чтобы отслеживать текущий прогресс.
  • Метод рисования пирога на основе текущего прогресса.

Номер один прост, просто держите поле участника, которое отслеживает текущий процент пирога, чтобы рисовать. Номер 2 немного сложнее, но, к счастью, мы можем сделать это со стандартными методами рисования Canvas.

Удобно, что Android Canvas класс предоставляет drawArc(). Вы можете использовать это, чтобы получить эффект пирога. Предполагая, что мы сохранили наш процент в поле члена, называемом mPercent, как float между 0 и 1, метод onDraw() может выглядеть следующим образом:

@Override
protected void onDraw(Canvas canvas) {

    final float startAngle = 0f;
    final float drawTo = startAngle + (mPercent * 360);

    // Rotate the canvas around the center of the pie by 90 degrees
    // counter clockwise so the pie stars at 12 o'clock.
    canvas.rotate(-90f, mArea.centerX(), mArea.centerY());
    canvas.drawArc(mArea, startAngle, drawTo, true, mPaint);

    // Draw inner oval and text on top of the pie (or add any other
    // decorations such as a stroke) here..
    // Don't forget to rotate the canvas back if you plan to add text!
    ...
}

Здесь, как выглядит готовое представление в примерном приложении:

PieProgressView in action!

Edit

После публикации я решил, что нет причин, по которым вам нужно реализовать пользовательский вид. Вы можете просто использовать свойство drawable и it level, чтобы сделать именно то, что необходимо. Я создал gist с полным рисунком.

Ответ 2

Сэкономьте некоторое время и до повторного создания колеса (или индикатора прогресса), проверьте, работает ли в http://github.com/Sage42/AndroidViewUtils вы. Просто добавьте его в свой проект и получайте удовольствие. Он настраивается и предлагает опции для подсчета или подсчета вниз.

Я забыл добавить, что изображения выглядят почти так же, как образ образца из вашего вопроса.

Ответ 3

Попробуйте этот фрагмент кода, чтобы создать круговой индикатор выполнения (круговая диаграмма). передайте его целочисленное значение, чтобы нарисовать, сколько процентов площади заполнения.:)

private void circularImageBar(ImageView iv2, int i) {

    Bitmap b = Bitmap.createBitmap(300, 300,Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(b); 
    Paint paint = new Paint();

        paint.setColor(Color.parseColor("#c4c4c4"));
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(150, 150, 140, paint);
        paint.setColor(Color.parseColor("#FFDB4C"));
        paint.setStrokeWidth(10);   
        paint.setStyle(Paint.Style.FILL);
        final RectF oval = new RectF();
        paint.setStyle(Paint.Style.STROKE);
        oval.set(10,10,290,290);
        canvas.drawArc(oval, 270, ((i*360)/100), false, paint);
        paint.setStrokeWidth(0);    
        paint.setTextAlign(Align.CENTER);
        paint.setColor(Color.parseColor("#8E8E93")); 
        paint.setTextSize(140);
        canvas.drawText(""+i, 150, 150+(paint.getTextSize()/3), paint); 
        iv2.setImageBitmap(b);
}

Ответ 4

Для круговой шкалы выполнения используйте:

style="?android:attr/progressBarStyle"

Более подробную информацию можно найти здесь: В чем смысл атрибута android: progressBarStyle в ProgressBar?

Что касается настройки его хода: круговой индикатор выполнения продолжает вращаться. Просто спрячьте его после того, как он больше не нужен.

Или вы можете реализовать что-то пользовательское: покажите TextView рядом с ним и обновите его, а не используйте Progressbar.setProgress.

Step 0: setText("0%");
Step 1 (2 seconds later): setText("3%");
Step 2 (4 seconds later): setText("9%"); etc.

Ответ 5

Даже если это старый вопрос, я надеюсь, что этот ответ может помочь будущим зрителям.

Посмотрите эту библиотеку - https://github.com/lzyzsd/CircleProgress

Для простого кругового прогресса, динамического или статического, эта библиотека довольно проста и имеет множество атрибутов для легкой настройки (например, ширина штриха, начальный угол, внутренний фон, цвет текста и т.д.). Для пользовательского интерфейса, который OP хотел достичь, эта библиотека была бы идеальной.

Образец образцового образа прогрессa