android 画爱心进度条_Android自定义View系列(一)——打造一个爱心进度条

本文介绍了如何在Android中自定义一个爱心形状的进度条,详细讲解了自定义View的流程,包括获取XML属性、测量、绘制等步骤,并通过贝塞尔曲线实现心形路径。文章还提供了完整代码,帮助读者理解自定义View的实现过程。
摘要由CSDN通过智能技术生成

写作原因:Android进阶过程中有一个绕不开的话题——自定义View。这一块是安卓程序员更好地实现功能自主化必须迈出的一步。下面这个系列博主将通过实现几个例子来认识安卓自定义View的方法。从自定义View到自定义ViewGroup,View事件处理再到View深入分析(这一章如果水平未到位可能今后再补充),其中会涉及一些小的知识,包括Canvas的使用、动画等等。系列第一篇文章通过绘制一个心形进度条来学习自定义View的整体流程和简单地贝塞尔曲线的用法。下面开始折磨键盘吧。

最终效果

先看看今天我们要实现的效果:

7eeb0bfb480d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

效果

具体功能就是一个心形的进度条,跟普通的进度条相似,但是显示进度的方式和整体的外观实现了自定义化。这个进度条会根据进度不断加深颜色,效果还不错。通过这个例子读者可以学会基本的自定义View的方法。

基本思路

我们需要新建一个attrs.xml来描述HeartProgressBar的属性,一个HeartProgressBar.java继承ProgressBar(直接继承View也行),然后通过取出属性,测量,绘制几步来实现自定义View全过程。

具体实现

一、定义XML属性文件

新建values/attrs.xml,在XML中声明好各个属性,注意一下format,详细的用法参考官方文档。然后在标签下引入属性,具体见下面:

二、获取XML中的属性

这一步我们使用obtainAttributes()方法来获取开发者在布局中为我们的View设定的参数值。通过TypedArray ta = getResources().obtainAttributes(attrs,R.styleable.HeartProgressBar);获得TypedArray对象,使用该对象的get系列方法来获取参数值,如:unReachedColor = ta.getColor(R.styleable.HeartProgressBar_UnReachedColor,UNREACHEDCOLOR_DEFAULT);。后面的UNREACHEDCOLOR_DEFAULT是默认参数值,是view创建者定义的,注意尺寸相关的需要进行单位转换。这样就取到了View的参数,这些参数是我们用来定义View的部分元素。

三、调用onMeasure()测量

这一步常常令许多人头大甚至望而却步,看了很多资料也理解不了。我在这里分享一下对于这一块的理解,希望能够帮助大家理解。首先得明白View的规格是受承载它的View或者ViewGroup影响的。这点很重要,因为这点才出现了三种测量模式:MeasureSpec.EXACTLY、MeasureSpec.UNSPECIFIED和MeasureSpec.AT_MOST。这三种测量模式分别对应三种情况:View有确定的宽高(包括match_parent和具体值两种情况),此时使用EXACTLY,直接把MeasureSpec.getSize()返回就行;View没有确定的宽高(即wrap_content),此时可能系统会使用MeasureSpec.UNSPECIFIED或者MeasureSpec.AT_MOST。在MeasureSpec.UNSPECIFIED中我们把尽量容纳View的尺寸返回给父View去处理,而在MeasureSpec.AT_MOST中则由于父View对子View的限制需要比对父View的限制的最大情况和子View尽可能容纳的尺寸,然后返回相对较小的值。看看本文的例子:

int usedHeight = getRealHeight(heightMeasureSpec);

int usedWidth = getRealWidth(widthMeasureSpec);

setMeasuredDimension(usedWidth,usedHeight);

这里将宽高测量后使用setMeasureDimension()返回给父View去处理。

以宽为例,代码如下:

public int getRealWidth(int widthMeasureSpec) {

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int widthVal = MeasureSpec.getSize(widthMeasureSpec);

//取得父View或ViewGroup分配的默

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值