转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 【Rocko's blog】
之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下:
然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了啊...啊..)毅然决定把它鼓捣出来,最终的效果如下(总感觉有点不和谐啊·):
对比能看出来的就是多了形状的选择还有使用图片了,那么接下来就是它的实现过程。
对自定义View实现还不明白的建议看下郭神的博客(View系列4篇): Android LayoutInflater原理分析,带你一步步深入了解View(一) 和大苞米的这篇:ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
自定义属性
自定义View一般都要用到view本身的属性了,重写现有的控件则不用。额,然后我们的这个BounceProgressBar需要什么特有的属性呢?首先要明确的是这里BounceProgressBar没有提供具体进度表现的实现的。再具体想想:它需要每个图像的大小,叫singleSrcSize,类型就是dimension了;上下跳动的速度,叫speed,类型为integer;形状,叫shape,类型为枚举类型,提供这几个形状的实现,original、circle、pentagon、rhombus、heart都是见名知意的了;最后是需要的图片资源,叫src,类型为reference|color,即可以是drawable里的图片或颜色值。
有了需要的属性后,在values文件夹下建个资源文件(名字随意,见名知意就好)来定义这些属性了,如下,代码可能有些英文,而且水平有些渣,不过一般前面都会解释了的:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="BounceProgressBar">
<!-- the single child size -->
<attr name="singleSrcSize" format="dimension" />
<!-- the bounce animation one-way duration -->
<attr name="speed" format="integer" />
<!-- the child count ,本来还想能自定义个数的,但是暂时个人实现起来有些麻烦,所以先不加这个-->
<!-- <attr name="count" format="integer" min="1" /> -->
<!-- the progress child shape -->
<attr name="shape" format="enum">
<enum name="original" value="0" />
<enum name="circle" value="1" />
<enum name="pentagon" value="2" />
<enum name="rhombus" value="3" />
<enum name="heart" value="4" />
</attr>
<!-- the progress drawable resource -->
<attr name="src" format="reference|color"></attr>
</declare-styleable>
</resources>
然后先把BounceProgressBar类写出来如下:
public class BounceProgressBar extends View {
//...
}
现在就可以在布局里用我们的BounceProgressBar了,这里需要注意的是,我们需要加上下面代码第二行命名空间才能使用我们的属性,也可以把它放到根元素的属性里。
<org.roc.bounceprogressbar.BounceProgressBar
xmlns:bpb="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
andro