【Android 开发】自定义View(上)——方法介绍
内容简概
一、onDraw方法介绍
二、onMeasure方法介绍
三、onSizeChanged方法介绍
四、其他问题
具体内容
一、onDraw方法介绍
(一)Paint
- Paint在Android开发中充当画笔的功能,在绘图中发挥了重要的作用。一般只有当系统提供的方法不能满足需求时,才用onDraw方法自绘。下面展示一些常用的方法。
方法 | 作用 |
---|---|
setColor(int color) | 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。 |
setAntiAlias(boolean aa) | 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。 |
setStyle(Paint.Style style) | 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE Style.FILL: 实心 STROKE:空心 FILL_OR_STROKE:同时实心与空心。 |
setStrokeWidth(float width) | 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度。 |
setTextSize(float textSize) | 设置绘制文字的字号大小 |
(二)Path
- Path是绘图的路径,可以用来绘制直线、圆、贝塞尔曲线等。下面主要介绍绘制贝塞尔曲线的方法。
方法 | 作用 |
---|---|
moveTo(x1,y1) | 移动画笔 |
quadTo(x1,y1,x2,y2) | 绘制贝塞尔曲线 |
cubicTo(x1,y1,x2,y2,x3,y3) | 绘制贝塞尔曲线 |
那么quadTo和cubicTo有什么不同呢?cubicTo其实就多了一个控制点
。看一个例子,绘制同样的贝塞尔曲线:
用quadTo:
mPath.moveTo(100, 500);
mPath.quadTo(300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);
用cubicTo:
mPath.moveTo(100, 500);
mPath.cubicTo(100, 500, 300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);
如果cubicTo的例子中不加moveTo呢?那么cubicTo则以(0,0)为起点,(100,500)和(300,100)为控制点绘制贝塞尔曲线:
(三)Canvas
- 翻译过来就是画布,用来对画布进行一些操作,下面是一些常用方法。
方法 | 作用 |
---|---|
drawColor、drawRGB、drawARGB | 给画布绘制颜色 |
drawPoint、drawLine、drawCircle、drawArc | 画点、线、圆、圆弧 |
drawBitmap、drawPicture | 绘制图片 |
drawText | 绘制文字 |
drawPath | 绘制路径 |
二、onMeasure方法介绍
onMeasure 方法简单的理解就是是用于测量视图的大小,主要是用来测量自己和内容的来确定宽度和高度。下面是使用的例子。
/**
* 当继承于ViewGroup的时候
* @param widthMeasureSpec 父控件预测的这个控件的最大宽度
* @param heightMeasureSpec 父控件预测的这个控件的最大高度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//固定的尺寸 - 自己设定宽高
//setMeasuredDimension(100,100);
}
onMeasure 作用
(1)一般情况重写onMeasure()方法作用是为了自定义View尺寸的规则,如果你的自定义View的尺寸是根据父控件行为一致,就不需要重写onMeasure()方法 。
(2)如果不重写onMeasure方法,那么自定义view的尺寸默认就和父控件一样大小,当然也可以在布局文件里面写死宽高,而重写该方法可以根据自己的需求设置自定义view大小。如果这个方法被重写,它的子类要保证测量高度和宽度至少是view的最小高宽
,否则子类将无法在界面展示出来!!!
目前为止,写的小动画都可以直接用父视图,根本不需要用这个方法,显得这个方法有点鸡肋,不过也许以后会用到吧。为什么要用onMeasure?
三、onSizeChanged方法介绍
这个方法是在视图的大小发生改变后的回调,使用这个方法可以让形状“动起来”,制成简易的动画。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
四、其他问题
(一)Paint.ANTI_ALIAS_FLAG是使位图抗锯齿的标志。
用法: Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
参考文章:Paint效果相关
(二)drawArc变量详解
drawArc有两种写法,法一是通过 RectF 来确定弧线的位置和大小,第二种是直接设置(第二种需要 API 21)。
// 法一
canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
// 法二
canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
先用一张图让你了解它各个参数的定义。
具体使用如下:
// 法一
RectF frame = new RectF(50,100,50,50);
canvas.drawArc(frame,120,300,false,mPaint);
// 法二
canvas.drawArc(50,100,50,50, 120, 300, false, Paint paint)
(三)在使用drawArc时,有可能会遇到以下问题:
提示API过低,这时候只需要在Gradle里修改版本即可,最后不要忘了sync Now。
结语:
方法就介绍到这,具体的使用请见下一篇文章。