我找到了一个可行的解决方案,如何设置具有适当大小和填充的不确定进度条。我的解决方案没有使用 setActionView() 的解决方法。它是内置进度条功能的解决方案,由本机操作栏 (ActionBarSherlock) 支持。进度条通过setProgressBarIndeterminateVisibility(boolean)方法启用/禁用。我在 Android 2、3、4 和 ldpi、mdpi、xhdpi 上对其进行了测试。
AndroidManifest.xml:
<application
...
android:theme="@style/Theme.Example">
/res/values/styles.xml:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
...
<style name="Theme.Example" parent="Theme.Sherlock">
<item name="actionBarStyle">@style/Example.ActionBar</item>
<item name="android:actionBarStyle">@style/Example.ActionBar</item>
</style>
<style name="Example.ActionBar" parent="Widget.Sherlock.ActionBar">
<item name="indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item>
<item name="android:indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item>
</style>
<style name="Example.ActionBar.IndeterminateProgressBar" parent="@android:style/Widget.ProgressBar.Large.Inverse">
<item name="android:indeterminateDrawable">@drawable/layer_list_ab_indeterminate_progress_bar</item>
<item name="android:minWidth">@dimen/ab_indeterminate_progress_bar_size</item>
<item name="android:maxWidth">@dimen/ab_indeterminate_progress_bar_size</item>
<item name="android:minHeight">@dimen/ab_indeterminate_progress_bar_size</item>
<item name="android:maxHeight">@dimen/ab_indeterminate_progress_bar_size</item>
</style>
</resources>
/res/drawable/layer_list_ab_indeterminate_progress_bar.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<!--
/res/drawable-mdpi/ab_indeterminate_progress_bar asset is taken from
/sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png
and its content (optical square) is resized to ~0.6 (must be even number)
/res/drawable-mdpi-v14/ab_indeterminate_progress_bar asset is taken from
/sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png
and its content (optical square) is resized to 0.75
-->
<rotate
android:drawable="@drawable/ab_indeterminate_progress_bar"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="360" />
</item>
</layer-list>
/res/values/dimens.xml:
<dimen name="ab_indeterminate_progress_bar_size">48dp</dimen>
最后我创建了进度条资产。我使用了来自 Android SDK 的这两个资产:
- /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png 适用于Honeycomb 和更早版本
- /sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png 用于ICS 和更新版本
为了获得适当的尺寸和填充,我们需要调整资产的大小。我将 spinner_white_48.png 调整为~0.6。对于 mdpi,它是 28px。它必须是偶数才能中心对称。我只调整了内容的大小,而不是整个图标。所以 mdpi 中的图标仍有 48px,但它的内容(光学正方形)更小(28px)。您可以通过这种方式轻松调整内容的大小:首先将“图像大小”更改为 28px X 28px,然后将“画布大小”更改回 48px X 48px。我将 spinner_48_outer_holo.png 调整为0.75。您可以下载以下资产。
为什么我对 Honeycomb- 和 ICS+ 使用不同的资产?因为如果我只使用 Holo 资源,动画在某些带有 Honeycomb- 的设备上会有点抢眼。
提示:您可以向 layer_list_ab_indeterminate_progress_bar.xml 添加另一个带有一些动画的项目。例如,标准的 Holo 进度条使用 2 个具有相反方向和不同度数范围的动画。请参阅 SDK 中的 progress_medium_holo.xml。
/res/drawable-mdpi/ab_indeterminate_progress_bar.png:
/res/drawable-mdpi-v14/ab_indeterminate_progress_bar.png (在此页面上几乎看不到):
/res/drawable-hdpi/ab_indeterminate_progress_bar.png:
/res/drawable-hdpi-v14/ab_indeterminate_progress_bar.png (在此页面上几乎看不到):
/res/drawable-xhdpi/ab_indeterminate_progress_bar.png:
/res/drawable-xhdpi-v14/ab_indeterminate_progress_bar.png (在此页面上几乎看不到):