Android自定义View入门

之前对自定义View总是有很多的畏惧,不知道从什么地方入手,近期感觉不能再这样一直使用别人的代码了,要试着自己去真正的了解一下Android的底层了。所以买来任教主的《Android开发艺术探索》,仔细一读还真有收获。

现在记录下来,为跟我一样的新手提供一些学习路上的帮助。

在我的理解,自定义View分为以下的几类:

  1. 继承View重写onDraw方法,一般相对来说比较简单。
  2. 继承ViewGroup派生出特殊的Layout,这里可以做的更加复杂。
  3. 继承自特定的View来实现的特定的功能

对于第一种,相对来说要比较简单,一般就是画个圆画个方块之类的,然后复杂一点可能就要加上动画;第二种,可以实现更加复杂的动画效果,动画之间可能会有一些比较复杂的关联之类的;最后一种,继承自某一个View,例如继承自一个Edittext,我们可以自己加入一些对EditText中内容的特殊处理。

今天只说最简单的一种:继承View并实现动画,以一个加载等待控件为例,实现的效果如下

Imgur

STEP 1 编写一个类继承自View,并重写构造方法

  1. 一般在构造方法中,我们会抽取出一个init()方法来进行对View的初始化工作,例如初始化画笔Paint、路径Path等等,总之哪些只有在第一次创建View的时候才会构建的参数都要在这里来初始化。
  2. 一般会重写三个构造方法,这三个构造方法有不同的参数,其实是代表了View不同的初始化方式,具体如下:
    public LoadingPopPoint(Context context) {        
        super(context);
        //这个是在java代码中构建的时候调用
    }
    
    public LoadingPopPoint(Context context, AttributeSet attrs) {
        super(context, attrs);
        //这个是在使用xml构建的时候并且没有指定style的时候调用
    }
    
    public LoadingPopPoint(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //这是指定了style的时候调用的方法
    }
    

一般都会在构造方法中调用init来保证初始化的完成

STEP 2 重写onDraw方法,在onDraw方法中使用canvas绘图

使用在init方法中初始化的paint对象,来绘制图形,其实动画的原理就和老式的电影放映是一样的,一帧一帧地刷新就好,其实就是在onDraw方法中不停的隔一段时间就重画一下。这时就要postInvalidateDelayed(50)这个方法登场了,这个方法会每隔指定的时间来调用View的invalidate()方法,最终会重新调用onDraw方法,完成一个周期,所以如果想控制动画,我们就可以定义一个全局的progress变量,在onDraw方法中不断的递增,然后绘制图形的时候根据这个progress来做出相应的调整,图形不就动起来了吗?

好了,上代码:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < pointNumber; i++) {
            progress[i] = progress[i] + STEP;
            radius = getRadiusByProgress(progress[i]);
            canvas.drawCircle((float) (getWidth() / 2 + x), getHeight() / 2, radius, paints.get(i));
        }
        //redraw the view per 40 milliseconds ,and show the animation
        postInvalidateDelayed(40);
    }

这里的这个getRadiusByProgress方法中做了一些数学的计算,计算了应该在什么地方画圆,以及这个圆的半径之类的信息,而这里正是这个View的核心部分,真心感觉数学很重要啊。。。。这个算法想了好半天才想明白。。。

其实那些比较炫酷的View动画的实现,后面都有很强大的算法在做支撑,总结起来其实就是:

一个好的View动画=强大的算法+对Android系统API的熟练应用

个人感觉这个是新手入门的比较不错的例子,好了,代码是最好的老师,有什么问题看代码咯 GitHub地址

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

推荐阅读更多精彩内容

  • 前言 在Android应用开发过程中,固定的一些控件和属性可能满足不了开发的需求,所以在一些特殊情况下,我们需要自...
    空空大师丶阅读 846评论 0 3
  • 概述 自定义View是Android程序员在进阶阶段是必须经历的也是痛苦的,但是它也没有想象的那么麻烦,无非也就是...
    吴唐人阅读 216评论 0 1
  • 前几天 Ui 突然给我一个 gif 图说要把这个做成启动动画,看到效果图的我表示一脸懵逼。 好吧,懵逼归懵逼,效果...
    Anonymous___阅读 20,472评论 93 269
  • 百二秦关终属楚,三千越甲当吞吴。 一春播尽万千种,静待秋实果成熟。
    掌尘阅读 488评论 0 1
  • 最近看到一些喜欢的插画作品,其中不同的风格中有不同侧重的画面表现方法。现结合具体作品,谈谈画面中的“细节”与“节奏...
    霖霖加七阅读 523评论 0 1