优秀是一种习惯,越优秀就越想去努力,越努力就会越优秀。反过来也是一样,活得越差就越不想要去做些什么,或许是无力改变或许是真的太差了无从下手,于是越来越差,越差就越没动力去做,渐渐呆在舒适区,坐以待毙。
现在过的每一天,都是余生中最年轻的一天...
自定义View对于一个Android开发者来说是必须掌握的知识点,也是Android开发进阶的必经之路。
为什么要自定义View?主要是Android系统内置的View无法实现我们的需求,我们需要针对我们的业务需求定制我们想要的View。
自定义View的最基本的三个方法分别是:onMeasure()、onLayout()、onDraw()。
View在Activity中显示出来,要经历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。
测量:onMeasure()决定View的大小;
布局:onLayout()决定View在ViewGroup中的位置;
绘制:onDraw()决定绘制这个View。
自定义控件又分为自定义View和自定义ViewGroup,自定义View只需要重写onMeasure()和onDraw()即可,而自定义ViewGroup则只需要重写onMeasure()和onLayout()。
SpecMode指定了测量的模式,分为三类:
(1)UNSPECIFIED
父容器对View无任何限制,一般用于系统内部
(2)EXACTLY
View的最终大小就是SpecSize指定的值,适用于指定具体大小和match_parent的形式
(3)AT_MOST
父容器指定了一个SpecSize,View不能超过它,适用于wrap_content
在自定义view时,时常用到刷新view的方法,这时候就会有三个方法供我们选择:requestLayout()、invalidate()、postInvalidate(),其实invalidate和postInvalidate这两个方法作用是一样的,唯一不同的是invalidate用在主线程,而postInvalidate用在异步线程。
requestLayout会调用measure和layout 等一系列操作,requestlayout肯定会调用measure和layout,但不一定调用draw。invalidate 只会调用draw,而且肯定会调,即使什么都没有发生改变,它也会重新绘制。所以如果有布局需要发生改变,需要调用requestlayout方法,如果只是刷新动画,则只需要调用invalidate方法。

网友评论