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来实现全新的控件

你可能感兴趣的:(Android自定义控件知识点)