美文网首页
Android自定义控件知识点

Android自定义控件知识点

作者: _StackOverFLow | 来源:发表于2019-05-14 16:11 被阅读0次

    一、控件树

    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自定义控件知识点

          本文链接:https://www.haomeiwen.com/subject/readaqtx.html