【Android 开发】自定义View(上)——方法介绍

内容简概

一、onDraw方法介绍
二、onMeasure方法介绍
三、onSizeChanged方法介绍
四、其他问题

具体内容

一、onDraw方法介绍

(一)Paint
  1. 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) 设置绘制文字的字号大小
  1. 拓展文章:android 绘图之Paint的效果研究
(二)Path
  1. 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
  1. 翻译过来就是画布,用来对画布进行一些操作,下面是一些常用方法。
方法 作用
drawColor、drawRGB、drawARGB 给画布绘制颜色
drawPoint、drawLine、drawCircle、drawArc 画点、线、圆、圆弧
drawBitmap、drawPicture 绘制图片
drawText 绘制文字
drawPath 绘制路径
  1. 拓展文章:自定义控件之绘图篇(四):canvas变换与操作

二、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。





结语:

方法就介绍到这,具体的使用请见下一篇文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容