自定义View入门(一) - 构造方法

本章目录

  • Part One:自定义View概述
  • Part Two:构造方法
  • Part Three:构造方法的写法

Part One:自定义View概述

自定义View可以说是Android里最易学难精的知识点之一,它的入门非常的简单,实现几个固定方法即可,几十行代码就可以画出一个简单的图形。
但是,要想打包票说自己精通自定义View,是非常非常难以做到的事情,因为这里面不仅仅需要处理各种复杂的逻辑,还会涉及到大量的数学算法。
老实说,我也在学习的路上,这里只是给大家抛砖引玉一下。
好了,闲话不多说,自定义View大致上有以下三种应用情况:

  • 在现有的控件上,做些个性化的处理(继承自ImageView等 )
  • 现有的控件不满足于我们的需求,需要自己去创造(继承自View)
  • 讲几个控件组合到一起,新生成一个(继承自ViewGroup)
    而继承自现有控件和继承自View的应用方式差不太多,我们用一个画圆的案例把这两种情况需要掌握的各个知识点引入。

Part Two:构造方法

新建一个CircleView类,继承自View,提示需要添加构造方法,如下图所示:


Constructor.png

其中,四个参数的构造方法是Android5.0以后引入的,所以最低需要SDK21。
当然,这四个构造方法并不需要全部创建出来,大部分情况下,我们只要掌握前两个即可,我们一一来看下它们的应用场景。

  • 首先是一个参数的构造方法。
    SingleParameterConstructor.png

    它的应用范围比较小,没有涉及到属性的添加,不能在XML布局文件中使用。在代码中直接new一个自定义View实例的时候,才会调用此构造方法。例如:
    SingleParameterConstructorUsage.png

    其中,参数传入一个context对象即可生成一个实例,类似于我们直接new一个TextView(this);这种方式。
  • 接下来我们看2个参数的构造方法。


    TwoParameterConstructor.png

    这种方法适用于我们常用的控件使用方法,即在XML布局文件中调用自定义View的时候,会使用此构造方法,例如:


    TwoParameterConstructorUsage.png

    高度和宽度是在XML文件中必须写的内容,还有路径要写全,包括包名和类名。完成这两步就可以在代码中实例化该控件了。
  • 然后是3个参数的构造方法
    ThreParameterConstructor.png

    这里要非常的注意,在xml布局文件中调用自定义View,并且自定义View标签中还有自定义属性时,这里调用的还是第二个构造函数
    因为系统只会默认调用前两个构造方法,而如果我们想使用自定义属性,或者说后两个构造方法,必须在前面两个构造方法里手动调用(例如:在第二个构造方法里用this关键字调用此构造方法)。
  • 最后是4个参数的构造方法


    FourParameterConstructor.png

    应用方式和三个参数的构造方法一样,都是手动调用。
    至于四个参数分别是什么,这里先大概说一下,下一篇文章会详细解释

  1. context:The Context the view is running in, through which it can access the current theme, resources, etc. 也就是上下文对象
  2. attrs:The attributes of the XML tag that is inflating the view. 一些基础的XML布局使用的属性值集合。
  3. defStyleAttr:An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults. 就是theme中包含一个指向style资源的引用。当我们没有给自定义View设置属性时,就会调用这些默认的值,如果传入0表示不调用该默认值。
  4. defStyleRes:A resource identifier of a style resource that supplies default values for the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not look for defaults. 它的性质和defStyleAttr差不多,但是只有defStyleAttr设置为0或者在当前的theme中没有找到相关属性时,才会去读取该属性,那么很明显优先级是defStyleAttr更高。

Part Three:构造方法的写法

我们常用的构造方法的写法有两种

  • 第一种,使用this关键字方式,逐级调用,最终调用四个参数的构造方法:


    FirstConstructor.png

    它的使用方式和官方的控件的构造方法是一样的,我们可以看看官方Button是怎么设计的。


    Button.png

    这里官方填写了defStyleAttr这个参数,所以说一般我们继承自View,想要传入参数的时候,使用这种构造方法即可。
    但是,如果如果继承自已有的控件,比如Button时,这种构造方法的写法会覆盖掉父类一些默认设置的style。此时,我们最好使用第二种写法。
  • 第二种,把初始化的内容封装到一个方法里,给各个构造方法调用:


    SecondConstructor.png

    当然了,并不是说我们必须使用第二种方式去处理继承自已有控件的状况。这么做只是因为可以节省一些工作量,毕竟我们只是在原有的基础上,做一些微调。
    官方的控件处理这种状况,依然是使用第一种方式,比如EditText就是继承自TextView,官方把defStyleAttr重新定义了一遍。这里我看不到源码,猜测这两个style有很大概率是有一些继承关系在里面的。相对来说,工作量比较大,改动也比较大。
    而如果不需要defStyleAttr时,这两种写法是没有区别的,任意选用即可。


暂时先写到这,下一节会继续写写自定义View的onDraw方法和自定义属性。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • Android实际开发过程中,不可避免的需要实现一些不规则的效果,这种效果不方便使用控件组合方式实现,往往需要静态...
    说话做事不违本心阅读 514评论 0 0
  • View的继承关系 Android中所有控件,都是View或View的子类,比如开发中最常写的代码 findVie...
    四月一号阅读 698评论 1 3
  • 很多年前我就跟自己说长大了一定要自己出去旅行去很多地方 直到现在这一步还没有踏出去.
    鬼画胡子阅读 134评论 0 0
  • 晚上睡不着,说点心里话。我15岁离开家里,开始了独立生活。从小性格特别要强,初中会因为数学考了98英语99而难过半...
    如三秋阅读 223评论 0 1