我想制作一个类似于Inbox by Gmail Android应用程序中的材料设计圆形进度条。我该如何实现它(在早期版本的Android系统中)?
我正在尝试实现类似于此效果。 Inbox by Gmail材料设计圆形进度条
我想制作一个类似于Inbox by Gmail Android应用程序中的材料设计圆形进度条。我该如何实现它(在早期版本的Android系统中)?
我正在尝试实现类似于此效果。 Inbox by Gmail材料设计圆形进度条
<ProgressBar
android:id="@+id/loading_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateTintMode="src_atop"
android:indeterminateTint="@color/your_customized_color"
android:layout_gravity="center" />
效果如下:
优秀的材料设计圆形进度条实现(来自rahatarmanahmed/CircularProgressView),
<com.github.rahatarmanahmed.cpv.CircularProgressView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/progress_view"
android:layout_width="40dp"
android:layout_height="40dp"
app:cpv_indeterminate="true"/>
我已将三个Material Design进度可绘制对象向后移植到Android 4.0,可作为普通ProgressBar
的即插即用替代品,外观完全相同。
这些可绘制对象还后移植了着色API(以及RTL支持),并使用?colorControlActivated
作为默认的着色。为方便起见,引入了一个扩展ProgressBar
的MaterialProgressBar
小部件。
DreaminginCodeZH/MaterialProgressBar
该项目还被afollestad/material-dialogs用于进度对话框。
在Android 4.4.4上:
在Android 5.1.1上:
使用 Material Components 库,您可以使用 CircularProgressIndicator
:
类似这样:
<com.google.android.material.progressindicator.CircularProgressIndicator
android:indeterminate="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:indicatorColor="@array/progress_colors"
app:indicatorSize="xxdp"
app:indeterminateAnimationType="contiguous"/>
其中array/progress_colors
是一个包含颜色的数组:
<integer-array name="progress_colors">
<item>@color/yellow_500</item>
<item>@color/blue_700</item>
<item>@color/red_500</item>
</integer-array>
注意:需要至少版本1.3.0
app:indicatorSize="xxdp"
和 app:showAnimationBehavior
替换了。 - Gabriele Mariotti更新
从2019年开始,您可以轻松使用Material Components库中的ProgressIndicator
与Widget.MaterialComponents.ProgressIndicator.Circular.Indeterminate
样式实现此目标。
有关更多详细信息,请查看以下Gabriele Mariotti的答案。
旧实现
这是一个很棒的材料设计圆形中间进度条的实现https://gist.github.com/castorflex/4e46a9dc2c3a4245a28e。该实现只缺少添加类似于Android应用程序收件箱中的各种颜色的功能,但它已经做得非常好了。
原版缺少导入,并且包含一些错误。这个更新版可以直接使用。
@hide
注释(这是为SwipeRefreshLayout而存在的),但是没有任何阻止您将此类复制到您的代码库中。我曾试图使用简单的xml
实现此功能,但没有找到有用的答案,所以想出了这个方法。
这个方法在早期版本中也适用,并且与Material Design进度条非常接近。您只需要将此drawable
用作ProgressBar
布局中的indeterminate drawable
即可。
<?xml version="1.0" encoding="utf-8"?><!--<layer-list>-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360">
<layer-list>
<item>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="-90"
android:toDegrees="-90">
<shape
android:innerRadiusRatio="2.5"
android:shape="ring"
android:thickness="2dp"
android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->
<gradient
android:angle="0"
android:endColor="#007DD6"
android:startColor="#007DD6"
android:type="sweep"
android:useLevel="false" />
</shape>
</rotate>
</item>
<item>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="270">
<shape
android:innerRadiusRatio="2.6"
android:shape="ring"
android:thickness="4dp"
android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->
<gradient
android:angle="0"
android:centerColor="#FFF"
android:endColor="#FFF"
android:startColor="#FFF"
android:useLevel="false" />
</shape>
</rotate>
</item>
</layer-list>
</rotate>
android:indeterminatedrawable="@drawable/above_drawable"
带有背景的加载器。
将其添加到您的布局中:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/loader"
android:layout_width="35dp"
android:layout_height="35dp"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/background_loader"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/background_loader"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<ProgressBar
android:id="@+id/spinner_loader"
android:layout_width="31dp"
android:layout_height="31dp"
android:indeterminateTintMode="src_atop"
android:indeterminateTint="@color/blue"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffffff"/>
<size android:width="35dp" android:height="35dp"/>
</shape>
在代码中管理加载器的可见性:
class MainActivity : AppCompatActivity() {
private lateinit var loader: ConstraintLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loader = findViewById(R.id.loader)
loader.visibility = View.VISIBLE
}
}
结果: