Android自定义控件知识点
一、控件树
Android中控件大致被分为两类,viewGroup控件、view控件,viewGroup包含多个view,通过viewGroup,整个界面上的控件形成树形结构。
上层控件负责下层子控件的测量与绘制,并传递交互事件。
二、Android界面架构
Activity-->PhoneWindow-->Decorview(TitleView+ContentView)
设置requestWindowFeature(Window.FEATURE_NO_TITLE)全屏显示,即只有content内容了。所以要设置在setContentView()之前。
当程序调用setContentView后,AMS会回调onResume()方法,此时系统才会把整个DecorView添加至PhoneWindow,让其显示出来,从而最终完成界面绘制。
三、View的测量
记得构造方法要写多种,不然会导致不能inflate 出来。
public MyClockView(Context context){this(context, null);}
public MyClockView(Context context, @Nullable AttributeSet attrs){this(context, attrs, 0);}
public MyClockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);}
核心是MeasureSpec类
EXACTLY、AT_MOST、UNSPECIFIED
要支持wrap_content则必须重写onMeasure方法,若不重写则默认是EXACTlY模式
通过MesureSpec可以获取View的测量模式和View想绘制的大小。(MeasureSpec.getMode、MeasureSpec.getSize)
核心是:setMeasureDimension(int measureWidth,int measureHeight);将测量的值设置进去,所以,重写onMeasure后就是把测量后的宽高值设置进去。
四、View的绘制
重写onDraw(Canvas canvas)使用Canvas和paint画图,而在其他地方需要自己创建canvas
Canvas canvas = new Canvas(bitmap);--装载画布 canvas.drawBitmap:canvas与bitmap联系
作用:使将绘制效果作用到其他的bitmap 上。
五、ViewGroup的测量
viewGroup会去管理其子view:其中之一就是负责子view的显示大小。当ViewGroup大小为wrapContent时,ViewGroup就需要对子view遍历,获取子view大小,从而决定自己大小。其他模式下则通过确定值来设定自身大小。(ViewGroup通过便利所有子view,从而调用子view的Measure来获取每一个子view的测量结果)
通过重写onLayout方法控制子view放到合适的位置,(ViewGroup通过便利所有子view,从而调用子view的layout来决定每一个子view的布局位置)
viewGroup不需要绘制,而是通过子view的绘制完成。
六、实现自定义控件的方式
a、对现有控件进行拓展
b、通过组合来实现新的控件
c、重写view来实现全新的控件