Android 带有图像的自定义进度条或带有clipdrawable的图像视图

Android 带有图像的自定义进度条或带有clipdrawable的图像视图,android,android-progressbar,Android,Android Progressbar,我一直在寻找关于自定义进度条的教程,我发现95%的内容是如何使用颜色和渐变来自定义,而不是使用图像(基本上是一个带有图像的空条图像或顶部是完整条图像)。当我尝试将图像用于进度条时,尺寸是错误的(包裹内容无法正常工作,并且被截断了一半) 我能够使用带有clipdrawble和级别设置的图像实现一个成功的图像栏 那么,是否不赞成将带有图像的ProgressBar用作其背景/进度,而我应该使用imageview?关键是要确保ProgressBar考虑到自定义绘图表的尺寸。一种方法是覆盖测量上的。下面是

我一直在寻找关于自定义进度条的教程,我发现95%的内容是如何使用颜色和渐变来自定义,而不是使用图像(基本上是一个带有图像的空条图像或顶部是完整条图像)。当我尝试将图像用于进度条时,尺寸是错误的(包裹内容无法正常工作,并且被截断了一半)

我能够使用带有clipdrawble和级别设置的图像实现一个成功的图像栏


那么,是否不赞成将带有图像的ProgressBar用作其背景/进度,而我应该使用imageview?

关键是要确保
ProgressBar
考虑到自定义绘图表的尺寸。一种方法是覆盖测量上的
。下面是自定义类的
onMeasure
实现的大致草图(将其与
ProgressBar
的实现进行比较,您会注意到细微的变化):

然后,您可以将空条设置为自定义
ProgressBar
的背景,就像您通常对视图所做的那样-
android:background=“@drawable/empty\u bar”

下一部分是设置
progressDrawable
,您必须使用
,因为我们希望与进度条的可绘制结构紧密匹配()。以下是一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
       <shape>
         <solid android:color="#00000000"/>
       </shape>
    </item>
    <item android:id="@android:id/progress">
       <clip
         android:clipOrientation="vertical"
         android:gravity="bottom"
         android:drawable="@drawable/full_bar">
       </clip>
    </item>
</layer-list>

我不认为这是不赞成的。事实上,
ProgressBar
固有地使用可绘制的剪辑来实现动画效果。所以,我看你没有理由不使用它。但正如您所指出的,唯一的问题是视图如何测量自身。因此,您必须覆盖测量上的
,以确保您的绘图功能不会被切断。谢谢,有任何链接或示例可以帮助您实现这一点吗?非常感谢。我不需要用动画师,对吗?我只能做“设置进度”或“设置秒进度”对吗?@Snake是的,没错
ObjectAnimator
只是通过反射隐式地实现了这一点
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
       <shape>
         <solid android:color="#00000000"/>
       </shape>
    </item>
    <item android:id="@android:id/progress">
       <clip
         android:clipOrientation="vertical"
         android:gravity="bottom"
         android:drawable="@drawable/full_bar">
       </clip>
    </item>
</layer-list>
final ObjectAnimator animator = ObjectAnimator
            .ofInt(progressBar, "progress", 0, 100)
            .setDuration(2000);
animator.start();