- 该可绘制文件如何将水平物体变为圆形物体,以及当进度为 100% 时,它如何决定如何将进度条从 0 度设置为 360 度以形成一个完整的环?
当您指定style="?android:progressBarStyleHorizontal" 时,您真正想说的是 ProgressBar 将是确定的。来自 ProgressBar 的documentation:
为了表示确定的进度,您将进度条的样式设置为R.style.Widget_ProgressBar_Horizontal 并设置进度量。
默认情况下,ProgressBar 将是水平的,但正如您所指出的,它可以使用您的可绘制文件更改为圆形。
<shape
android:shape="ring"
android:innerRadiusRatio="2.5"
android:thickness="4dp"
android:useLevel="true">
<solid android:color="@color/colorPrimary" />
</shape>
注意android:useLevel="true" 这一行。这指定可绘制对象可以接受范围从 0 到 100 的 级别。可绘制对象根据级别集知道自己要绘制多少:0 表示不绘制任何内容,100 表示绘制 100 %。通过更改进度,您正在更改为可绘制对象设置的级别。尝试设置android:useLevel="false" 看看会发生什么。
- 另外,有没有办法控制动画的开始(例如从正 x 轴 90 度)?
在 XML 中,设置 android:rotation="90" 以使环从底部开始。
- 如何制作另一个自定义形状,例如从下到上填充不改变背景颜色的矩形(在填充之前表示矩形形状)?
有几种(也许更多)方法可以做到这一点。一种方法是定义一个layer-list drawable,它定义了背景矩形和可缩放的进度矩形。由于 ProgressBar 依赖于它们,因此 id 必须与指定的一样。
<layer-list>
<item
android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="@android:color/darker_gray" />
</shape>
</item>
<item
android:id="@android:id/progress">
<scale
android:scaleHeight="100%"
android:scaleGravity="bottom">
<shape android:shape="rectangle">
<solid android:color="@android:color/holo_red_light" />
</shape>
</scale>
</item>
您还可以在图层列表中使用可绘制的剪辑:
<layer-list>
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="@android:color/darker_gray" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip
android:clipOrientation="vertical"
android:gravity="bottom">
<shape android:shape="rectangle">
<solid android:color="@android:color/holo_red_light" />
</shape>
</clip>
</item>
</layer-list>
这是一个将所有内容组合在一起的示例布局:
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"
style="?android:progressBarStyleHorizontal"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="16dp"
android:progress="0"
android:progressDrawable="@drawable/bg_circular_progress_bar"
android:rotation="90"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@+id/progressBar2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar
android:id="@+id/progressBar2"
style="?android:progressBarStyleHorizontal"
android:layout_width="20dp"
android:layout_height="80dp"
android:layout_marginTop="16dp"
android:progress="0"
android:progressDrawable="@drawable/rectangular_progress_with_scale_drawable"
app:layout_constraintBottom_toTopOf="@+id/progressBar3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar" />
<ProgressBar
android:id="@+id/progressBar3"
style="?android:progressBarStyleHorizontal"
android:layout_width="20dp"
android:layout_height="80dp"
android:layout_marginTop="16dp"
android:progress="0"
android:progressDrawable="@drawable/rectangular_progress_with_clip_drawable"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar2" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="0/ 100"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar3" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="onClick"
android:text="Start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun onClick(view: View) {
view.isEnabled = false
var progress = 0
val handler = Handler()
Thread(Runnable {
while (progress < 100) {
progress += 5
handler.post {
progressBar.progress = progress
progressBar2.progress = progress
progressBar3.progress = progress
textView.text = "$progress/ ${progressBar.max}"
}
try {
Thread.sleep(100)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
runOnUiThread { view.isEnabled = true }
}).start()
}
}