想要了解android自定义View,去设计和实现自己想要的View,这里从最基础的知识透析安卓自定义控件实现机理。
首先我们来了解下做自定义View,必须知道的基础知识:
android.graphics包是核心渲染包,它提供了一些初级图形工具,诸如画布、颜色过滤器、画笔等,可以让你直接在屏幕上进行图像处理。这个包中提供了很多类。
1、Canvas--画板
Canvas是一个大大的画板,这个画板有多大,所有的View及实现的图形都在这个Canvas上实现。
Canvas类提供了三个构造方法:
Public Canvas();构造一个默认无参的Canvas对象
Public Canvas(Bitmap bitmap);根据一个Bitmap构造一个Canvas对象
Public Canvas(GL gl);根据一个GL来构造一个对象
2、Paint--画笔
有画板没有画笔怎么能行了,没错Paint就是画笔。掌管Android王国中的所有画笔。
Paint类有三个构造方法:
Public Paint()构造一个缺省的Paint对象
Public Paint(int flags);根据指定的flags来构造一个Paint对象,创建之后可以用
setFlags()方法来更改
Public Paint(Paint paint)根据指定的paint对象来构造一个Paint对象
3、Color--颜色
Color.parseColor(String str);函数这个函数太强大了,解析Alpha颜色和普通的颜色。
颜色被表示为封装的数值,这个数值由四个字节组成,分别是:alpha、red、green、blue,这些值是非自左乘的,也就是说任何透明性只存储在alpha部分,而不是在颜色组成部分。每一部分按照如下的顺序保存:(alpha<<24)|(red<<16)|<green<<8)|blue.每一部分的取值范围在0-255之间,0意味着这部分不起作用,255表示100%的起作用。因此不透明的黑色应该是0xFF000000,不透明的白色应该是0xFFFFFFFF
。
4、Bitmap--位图
这个类可以掌管天下的png和jpg图片。我们会使用三种方法获得Drawable文件夹下的图片
5、Typeface类android.graphics.Typeface
ypeface类定义字体和字体内在的类型。这个类被用在画笔Paint设置的时候,比如用textSize,textSkewX和textScale设置来指定text在画的时候如何来显示和测量。
Typeface提供了一些常量值来表示自身的一些属性,比如BOLD,BOLD_ITALIC,ITALIC等
6、Path类android.graphics.Path
Path类(一组区域)的描画,类囊括多种几何图形比如直线线段、二次曲线、三次曲线等,
调用Canvas.drawPath()方法可以将Path以所定义的paint的方式来画到画板上或者填出图形,也可以用paint所指定方式来画图形。
7、RectF类android.graphics.RectF和Rect类android.graphics.Rect
RectF这个类包含一个矩形的四个单精度浮点坐标。矩形通过上下左右4个边的坐标来表示一个矩形。这些坐标值属性可以被直接访问,用width()和height()方法可以获取矩形的宽和高。注意:大多数方法不会检查这些坐标分类是否错误(也就是left<=right和top<=bottom).
RectF一共有四个构造方法:
RectF()构造一个无参的矩形
RectF(float left,float top,float right,float bottom)构造一个指定了4个参数的矩形
RectF(Rect F r)根据指定的RectF对象来构造一个RectF对象(对象的左边坐标不变)
RectF(Rect r)根据给定的Rect对象来构造一个RectF对象
RectF提供了很多方法,下面介绍几个方法:
Public Boolean contain(RectF r);判断一个矩形是否在此矩形内,如果在这个矩形内或者和这个矩形等价则返回true,同样类似的方法还有public Boolean contain(float left,float top,float right,float bottom)和public Boolean contain(float x,float y)。
Public void union(float x,float y)更新这个矩形,使它包含矩形自己和(x,y)这个点。
RectF类提供的方法都比较简单,容易理解,再此就不再一一赘述
Android.graphics.Rect类,这个类同android.graphics.RectF很相似,不同的地方是Rect类的坐标是用整形表示的,而RectF的坐标是用单精度浮点型表示的。
实现一个自定义View,需要实现以下步骤:
1,继承View
-
public class MyView extends View {
2,重写父类View的一些方法,例如onDraw;
-
@Override
-
protected void onDraw(Canvas canvas) {
-
super.onDraw(canvas);
-
-
-
-
-
int centre = getWidth()/2;
-
int radius = (int) (centre - roundWidth/2);
-
paint.setColor(roundColor);
-
paint.setStyle(Paint.Style.STROKE);
-
paint.setStrokeWidth(roundWidth);
-
paint.setAntiAlias(true);
-
canvas.drawCircle(centre, centre, radius, paint);
-
-
Log.e("log", centre + "");
-
}
-
3,根据onDraw需要到的属性,可以自定义View属性(values下建立attrs.xml文件);
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="RoundProgressBar">
<attr name="roundColor" format="color"/>
<attr name="roundProgressColor" format="color"/>
<attr name="roundWidth" format="dimension"></attr>
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
<attr name="max" format="integer"></attr>
<attr name="textIsDisplayable" format="boolean"></attr>
<attr name="style">
<enum name="STROKE" value="0"></enum>
<enum name="FILL" value="1"></enum>
</attr>
</declare-styleable>
</resources>
4,布局中或是代码中应用自定义View,如:
<net.changxing.test.MyView
android:id="@+id/roundProgressBar2"
android:layout_width="80dip"
android:layout_height="80dip"
android:layout_alignLeft="@+id/roundProgressBar1"
android:layout_alignParentBottom="true"
android:layout_marginBottom="78dp"
app:roundColor="#D1D1D1"
/>
5、在activity中实例化,修改相应属性成功现实出设计的自定义View;