带圆角的 Android 圆形进度条

     2023-04-14     103

关键词:

【中文标题】带圆角的 Android 圆形进度条【英文标题】:Android circular progress bar with rounded corners 【发布时间】:2016-08-06 23:37:54 【问题描述】:

我正在尝试获得一个带有圆角的圆形进度条,如下所示。

但到目前为止,我无法获得圆角,我能够获得圆形进度条。

我正在尝试使用 xml drawable 来绘制它。

 <ProgressBar
                android:id="@+id/onboarding_activity_progress_bar"
                android:layout_gravity="center"
                android:padding="10dp"
                android:layout_
                android:layout_
                style="?android:attr/progressBarStyleHorizontal"
                android:progressDrawable="@drawable/progressbar_onboarding_view"
                tools:progress="60"/>

Progressbar_onboarding_view.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape android:useLevel="false"
               android:innerRadiusRatio="2.0"
               android:shape="ring"
               android:thickness="10dp">
            <solid android:color="@color/progress_bar_background_color" />
            <corners android:radius="50dp"/>
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <shape
              xmlns:android="http://schemas.android.com/apk/res/android"
              android:useLevel="true"
              android:innerRadiusRatio="2.0"
              android:shape="ring"
              android:thickness="10dp">
            <solid android:color="@color/progress_bar_color" />
        </shape>
        <!--
        <scale
              android:drawable="@drawable/progressbar_round_corner"
              android:scaleWidth="98%" /> -->
    </item>
</layer-list>

progressbar_rounded_corner.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

   <corners
         android:radius="10dp"/>

   <solid android:color="@android:color/white" />

   <stroke
         android:
         android:color="@android:color/holo_red_dark" />

</shape>

我尝试使用 scale 参数,但进度角没有改变。我不确定如何实现圆角。请帮忙,我将不胜感激。

【问题讨论】:

在@android:id/progress 中添加角 @Pravin 我已经尝试过了,但是没有用。似乎角只适用于矩形。 试试这个库:Progress Widget @VipulAsri 感谢您的建议,但我不想使用第三方库。因为我想低于 dex 限制,而我的应用程序已经非常接近 dex 限制了。 看看这个答案***.com/questions/31219455/… 【参考方案1】:

一个简单高效的类扩展View 以绘制圆形进度,圆角作为选项。进度颜色、背景颜色、笔画宽度也可自定义。

import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
import androidx.annotation.FloatRange

class CircularProgressView : View 
  constructor(context: Context) : super(context)
  constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
  constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

  private val progressPaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG).apply 
    style = Paint.Style.STROKE
  
  private val backgroundPaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG).apply 
    style = Paint.Style.STROKE
  

  private val rect = RectF()
  private val startAngle = -90f
  private val maxAngle = 360f
  private val maxProgress = 100

  private var diameter = 0f
  private var angle = 0f

  override fun onDraw(canvas: Canvas) 
    drawCircle(maxAngle, canvas, backgroundPaint)
    drawCircle(angle, canvas, progressPaint)
  

  override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) 
    diameter = Math.min(width, height).toFloat()
    updateRect()
  

  private fun updateRect() 
    val strokeWidth = backgroundPaint.strokeWidth
    rect.set(strokeWidth, strokeWidth, diameter - strokeWidth, diameter - strokeWidth)
  

  private fun drawCircle(angle: Float, canvas: Canvas, paint: Paint) 
    canvas.drawArc(rect, startAngle, angle, false, paint)
  

  private fun calculateAngle(progress: Float) = maxAngle / maxProgress * progress

  fun setProgress(@FloatRange(from = 0.0, to = 100.0) progress: Float) 
    angle = calculateAngle(progress)
    invalidate()
  

  fun setProgressColor(color: Int) 
    progressPaint.color = color
    invalidate()
  

  fun setProgressBackgroundColor(color: Int) 
    backgroundPaint.color = color
    invalidate()
  

  fun setProgressWidth(width: Float) 
    progressPaint.strokeWidth = width
    backgroundPaint.strokeWidth = width
    updateRect()
    invalidate()
  

  fun setRounded(rounded: Boolean) 
    progressPaint.strokeCap = if (rounded) Paint.Cap.ROUND else Paint.Cap.BUTT
    invalidate()
  

【讨论】:

感谢您的出色解决方案!一个澄清问题:在updateRect 方法中,要让圆边到边绘制,在设置矩形坐标之前将获得的strokeWidth 除以2 不是更好吗?在当前设置下,矩形周围有小填充。 这是用什么语言写的? 以上用 Kotlin 编写的程序【参考方案2】:

使用Material CircularProgressIndicatorapp:trackCornerRadius="5dp" 获得曲线进度指示器。

  <com.google.android.material.progressindicator.CircularProgressIndicator
            app:indicatorSize="95dp"
            android:progress="60"
            app:trackCornerRadius="5dp"
            app:trackThickness="6dp"
            app:trackColor="@color/track_color"
            app:indicatorColor="@color/yellow_percent"
            android:layout_
            android:layout_ />

【讨论】:

【参考方案3】:

我知道这是一个老问题。但这里有一个可能对其他人有帮助的解决方案。

这个library可以用来实现这个。

只需将其添加到您的 Gradel 文件中

compile 'pl.pawelkleczkowski.customgauge:CustomGauge:1.0.3'

然后将其添加到您的 XML 布局

   <pl.pawelkleczkowski.customgauge.CustomGauge
        android:id="@+id/gauge2"
        android:layout_
        android:layout_
        android:layout_centerHorizontal="true"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="10dp"
        app:gaugeEndValue="100"
        app:gaugePointEndColor="@color/md_blue_800"
        app:gaugePointStartColor="@color/md_blue_300"
        app:gaugeStartAngle="180"
        app:gaugeStartValue="0"
        app:gaugeStrokeCap="ROUND"
        app:gaugeStrokeColor="@color/md_grey_400"
        app:gaugeStrokeWidth="10dp"
        app:gaugeSweepAngle="360" />

这就是设置进度条的方式

private CustomGauge gauge;// Declare this variable in your activity

gauge = findViewById(R.id.gauge2);//And this on you OnCreate method

gauge.setValue(progress);// Set the progress like this.

该库是开源的,可以在 General Public License, version 2 下使用

【讨论】:

【参考方案4】:

图书馆

compile 'pl.pawelkleczkowski.customgauge:CustomGauge:1.0.4'

XML 代码

<pl.pawelkleczkowski.customgauge.CustomGauge
            android:id="@+id/progressbar"
            android:layout_
            android:layout_

            app:layout_constraintStart_toStartOf="@id/lottie_empty"
            app:layout_constraintEnd_toEndOf="@id/lottie_empty"
            app:layout_constraintTop_toTopOf="@id/lottie_empty"
            app:layout_constraintBottom_toBottomOf="@id/lottie_empty"
            android:paddingBottom="10dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp"


            app:gaugePointEndColor="#3DEBFF"
            app:gaugePointStartColor="#246887"
            app:gaugeStartAngle="270"
            app:gaugeStrokeCap="ROUND"
            app:gaugeStrokeColor="#80777777"
            app:gaugeStrokeWidth="10dp"
            app:gaugeSweepAngle="360"
            
            />

java代码

private CustomGauge gauge;// Declare this variable in your activity
gauge = findViewById(R.id.gauge2);//And this on you OnCreate method
gauge.setEndValue(max_progress);// Set the max progress like this.
gauge.setValue(progress);// Set the progress like this.

Image from my apk

【讨论】:

怎样用div实现带百分百环形进度条

...html5直接就可用css3的属性去做圆形,border-radius即可实现圆角。2、图片形式,左右两侧做圆角图片,衔接好,即可实现,但右侧的需要在技术时进行变化3、背景形式,做左右两侧背景色+圆角png透明背景,背景采用颜色填充即可... 查看详情

圆角进度条,带数字居中显示的圆角进度条

自己实现一个圆角进度条,待文字显示居中的圆角进度条,这在很多实际项目当中都会用到的github地址:https://github.com/yongfengnice/CircleProgress效果图如下所示: 查看详情

带圆角的 QT/QML 材质进度条

】带圆角的QT/QML材质进度条【英文标题】:QT/QMLMaterialProgressBarwithroundedcorners【发布时间】:2019-05-2810:46:22【问题描述】:我想拥有Material风格的ProgressBar组件,但要进行一些修改以使其高度可调。到目前为止一切顺利,我得到了... 查看详情

圆形进度条 Android

】圆形进度条Android【英文标题】:CircularProgressBarAndroid【发布时间】:2015-06-0320:06:35【问题描述】:我想创建一个分段的圆形进度条,其行为类似于倒数计时器,这样每个分段都有自己的时间限制。有一个iOS应用pTimer+,我想在An... 查看详情

android中的圆形进度条

】android中的圆形进度条【英文标题】:Circularprogressbarinandroid【发布时间】:2015-09-1318:26:05【问题描述】:我想实现一些圆形进度条,中间有一个按钮,就像在whatsapp中一样。有谁知道一个好的图书馆来实现这一点?我想要完成... 查看详情

如何在 QT 中获得具有圆形边缘和圆形进度边缘的 QProgressBar?

...:32【问题描述】:我创建了一个垂直进度条,并尝试使用圆角设置它的样式。无论我做什么,我似乎都无法获得带有圆角边缘的进度条(QProgressBar::chunk)的进度或块。请帮 查看详情

圆形半径的Android进度条动态变化

】圆形半径的Android进度条动态变化【英文标题】:AndroidProgressbarwithcircleradiuschangesDynamically【发布时间】:2012-02-2212:53:06【问题描述】:我想根据滑块位置更改圆半径我分别创建了这两个。同时将circle方法应用于进度条。面临错... 查看详情

如何在android中实现材料设计圆形进度条

】如何在android中实现材料设计圆形进度条【英文标题】:Howtoimplementamaterialdesigncircularprogressbarinandroid【发布时间】:2015-01-0501:04:38【问题描述】:我想制作一个类似于InboxbyGmailandroid应用中的MaterialDesign圆形进度条。我如何实现... 查看详情

如何更改圆形进度条的颜色?

...gressbar?【发布时间】:2011-07-1707:03:54【问题描述】:我在Android上使用循环进度条。我想改变它的颜色。我正在使用"?android:attr/progressBarStyleLargeInverse"风格。那么如何改变进度条的颜色呢。如何自定义样式?另外,风格的定义是什... 查看详情

如何在Android中创建一个在其上旋转的圆形进度条?

】如何在Android中创建一个在其上旋转的圆形进度条?【英文标题】:HowtoCreateacircularprogressbarinAndroidwhichrotatesonit?【发布时间】:2014-02-1512:25:24【问题描述】:我正在尝试创建一个圆形进度条。这就是我想要实现的目标有一个灰... 查看详情

如何给progressbar圆形进度条设置颜色

参考技术AAndroid中ProgressBar自定义进度条的高度、颜色、圆角很多人知道怎么改颜色,可是改高度就是胡扯了,居然想通过maxHeight去改。准确方法在这里:下面这个改成了3-5个dp高度:首先是样式文件,这里定义高度:本回答被... 查看详情

android之自定义圆形进度条

    在Android开发中,对于进度条想必大家不会陌生。例如,应用在执行一个耗时操作时,会通过展示一个进度条来显示“加载中...”的动画作为友好页面以提高用户体验。对于这样的进度条,最简单的实现方式... 查看详情

android进度条样式怎么改

Android系统提供了两大类进度条样式,长形进度条(progressBarStyleHorizontal)和圆形进度条(progressBarStyleLarge)。android进度条样式更改:第一种(默认样式(中等圆形))第二种(长方形进度条)进度条用处很多,比如,应用程序装载资源... 查看详情

android自定义view之圆形进度条

这段时间正在学习自定义View以及属性动画的知识,然后刚好用这个来练练手,无图无真相,直接看图:简单自定义了一个比较通用的圆形进度条,像上图所示的可以定义圆的半径,进度颜色,宽度࿰... 查看详情

解决圆形进度条progressbar的几个问题(代码片段)

Android自带的Progressbar默认就是圆形的,可以通过style属性style="?android:attr/progressBarStyleHorizontal"变成条状进度条,如下:<ProgressBarandroid:layout_width="match_parent"androi 查看详情

解决圆形进度条progressbar的几个问题(代码片段)

Android自带的Progressbar默认就是圆形的,可以通过style属性style="?android:attr/progressBarStyleHorizontal"变成条状进度条,如下:<ProgressBarandroid:layout_width="match_parent"androi 查看详情

android自定义控件篇圆形进度条(代码片段)

一、效果图二、代码逻辑/***funcation:圆形进度条控件*/publicclassCircleProgressViewextendsViewprivatePaintmBackPaint,mProgPaint;//绘制画笔privateRectFmRectF;//绘制区域privateint[]mColorArray;//圆环渐变色privateintmProgress;//圆环进度(0-100)publicCircleProgressView(Co... 查看详情

带有图像和圆形进度条的圆形按钮

】带有图像和圆形进度条的圆形按钮【英文标题】:Circularbuttonwithimageandcircularprogressbar【发布时间】:2019-12-2819:29:53【问题描述】:我正在尝试制作一个按钮,里面有一个图像,外面有一个圆形进度条,按下按钮后是彩色的。我... 查看详情