ProgressBar in Android: How to Create Your Own

The ProgressBar is a crucial user interface component in Android applications, providing visual feedback to users about the progress of a long-running operation. While Android offers several built-in progress bar styles, there may be situations where you need to create a custom progress bar to match your app's unique design and branding. In this article, we'll explore how to create your own custom ProgressBar in Android.

Understanding the ProgressBar

Before diving into the implementation, let's briefly understand the ProgressBar and its different styles. The ProgressBar is a view that displays a horizontal or circular progression based on the current value set for the progress. Android provides the following built-in progress bar styles:

  1. Horizontal ProgressBar: Displays a horizontal line that grows from left to right as the progress increases.
  2. Circular ProgressBar: Displays a circular ring that fills up as the progress increases.
  3. Indeterminate ProgressBar: Displays an animated progression that continues indefinitely until the task is complete.

While these built-in styles are useful in many cases, creating a custom ProgressBar allows you to tailor the appearance and behavior to your specific requirements.

Creating a Custom ProgressBar

Creating a custom ProgressBar in Android involves extending the ProgressBar class and overriding the onDraw() method to handle the drawing of the progress bar. Here's a step-by-step guide to creating your own custom ProgressBar:

Step 1: Create a New Class

Start by creating a new class that extends the ProgressBar class. This new class will be responsible for drawing the custom progress bar.

class CustomProgressBar : ProgressBar { // Custom progress bar implementation goes here }

Step 2: Override the onDraw() Method

The onDraw() method is where you'll implement the drawing logic for your custom progress bar. This method is called by the Android system whenever the progress bar needs to be redrawn, such as when the progress value changes or the view is invalidated.

override fun onDraw(canvas: Canvas) { super.onDraw(canvas) // Get the current progress value val progress = progress val max = max // Calculate the dimensions and positions val width = width val height = height val progressWidth = (width * progress) / max // Draw the custom progress bar // ... }

Inside the onDraw() method, you can access the current progress value and the maximum value using the progress and max properties, respectively. You can then use these values to calculate the dimensions and positions of your custom progress bar.

Step 3: Draw the Custom Progress Bar

Within the onDraw() method, you can use the Canvas object passed as a parameter to draw your custom progress bar using various drawing methods provided by the Android framework. For example, you can use the drawRect() method to draw a rectangular progress bar or the drawArc() method to draw a circular progress bar.

override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val progress = progress val max = max val width = width val height = height val progressWidth = (width * progress) / max // Draw a rectangular progress bar val progressBarRect = RectF(0f, 0f, progressWidth.toFloat(), height.toFloat()) val progressBarPaint = Paint().apply { color = Color.BLUE style = Paint.Style.FILL } canvas.drawRect(progressBarRect, progressBarPaint) }

In the example above, we're drawing a rectangular progress bar using the drawRect() method. The RectF object defines the dimensions of the progress bar, and the Paint object sets the color and style of the progress bar.

You can further customize the appearance of your progress bar by adjusting the colors, styles, and other properties of the Paint object. Additionally, you can add other visual elements or animations to enhance the user experience.

Step 4: Use the Custom ProgressBar in Your Layout

Once you've created your custom ProgressBar class, you can use it in your Android app's layout files by referencing the class name.

<com.example.myapp.CustomProgressBar android:id="@+id/customProgressBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" />

In the XML layout file, replace com.example.myapp.CustomProgressBar with the package and class name of your custom progress bar class. You can set various attributes like android:max and android:progress to control the maximum value and initial progress value, respectively.

Handling Progress Updates

To update the progress of your custom ProgressBar, you can use the setProgress() method inherited from the base ProgressBar class. This method should be called whenever the progress value needs to be updated, such as during a long-running operation or when downloading a file.

// Update the progress value customProgressBar.progress = newProgressValue

By calling setProgress() with the new progress value, the Android system will automatically trigger a redraw of the progress bar, and your custom onDraw() implementation will be called to reflect the updated progress.


1. Can I create a custom progress bar for indeterminate progress?

Yes, you can create a custom progress bar for indeterminate progress by implementing an animation or a repeating pattern within the onDraw() method. This can be achieved by using techniques like rotating bitmaps, drawing multiple arcs, or using animations with ValueAnimator.

2. How can I make my custom progress bar responsive to different screen sizes?

To make your custom progress bar responsive to different screen sizes, you should use relative measurements instead of absolute values. For example, instead of using fixed pixel values for dimensions, you can use density-independent pixel (dp) or density-independent pixel scaling (sp) units. Additionally, you can adjust the dimensions and positioning based on the available width and height of the view.

3. Can I add text or other visual elements to my custom progress bar?

Absolutely! You can add text or other visual elements to your custom progress bar within the onDraw() method. Simply use the appropriate drawing methods, such as drawText() or drawBitmap(), and position them relative to the progress bar.

4. How can I handle different progress bar styles (e.g., horizontal, circular) in my custom implementation?

To handle different progress bar styles in your custom implementation, you can introduce a style parameter or use different subclasses for each style. Based on the selected style, you can adjust the drawing logic within the onDraw() method accordingly. For example, you might use drawRect() for a horizontal progress bar and drawArc() for a circular progress bar.

5. Can I add animations or transitions to my custom progress bar?

Yes, you can add animations or transitions to your custom progress bar to create more engaging and visually appealing user experiences. You can achieve this by using techniques like ValueAnimator, ObjectAnimator, or AnimatedVectorDrawable. These animations can be triggered when the progress value changes or based on user interactions.

Share On