第三章:Android控件架构与自定义控件详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38515203/article/details/82885001

《Android 群英传》——读书笔记

一、Android控件架构

  • Android中控件的分类:ViewGroup控件 以及 View控件
  • VewGroup(父控件):可以包含多个View控件,并对其进行管理。上层控件负责下层子控件的测量与绘制,并进行交互事件的传递。
  • Activity中使用的findViewById()就是在树控件中以树的深度优先遍历来查找对应元素。

    7208373-65ab675ac27c897f.jpg

    View树结构图.jpg

  • 通过调用requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,一定要在调用setContentView()方法之前才会生效。

    7208373-0333b01031aa20da.png

    标准视图树.png

二、View的测量

  • Android系统在绘制View之前,必须对View进行测量,即告诉系统改画一个多大的View。(在onMeasure()方法中进行)
  • Android提供的测量View的类——MeasureSpec()类
  • MeasureSpec——32位的int值。高2位:测量的模式。低30位:测量的大小。为提高优化效率在计算中采用的是位运算
  • 测量模式的分类(三种):
  • 1)EXACTLY——精确模式
            为layout_width属性或者layout_height属性指定具体数值(100dp或者match_parent)时所使用的模式
  • 2)AT_MOST——最大值模式
            wrap_content 不超过父控件允许的最大尺寸即可。
  • 3)UNSPECIFIED
            不指定其大小测量模式,View想多大就多大,通常在绘制自定义View时才会使用。
  • View类默认的onMeasure()方法只支持EXACTLY模式

三、View的绘制

  • 画板——Canvas
  • 画笔——Paint
  • 通常需要继承View并重写他的onDraw()方法来完成绘图
  • 其他地方使用Canvas需要创建一个Canvas对象。
Canvas canvas = new Canvas(bitmap);
  • 传入参数bitmap与通过这个bitmap创建的Canvas画布紧密相连,这个过程称为:装载画布
  • bitmap 用来存储所有绘制在Canvas上的像素信息

四、ViewGroup的测量

  • 当ViewGroup的大小为 wrap_content 时,ViewGroup就需要对子View进行遍历,获取所有子View的大小,从而决定自身的大小。
  • ViewGroup在测量时,遍历所有的子View,调用子View的Measure方法来获得每一个子View的测量结果。
  • ViewGroup测量结束后,通过遍历子View的Layout方法,来指定其具体显示的位置,从而来决定其布局的位置。

五、ViewGroup的绘制

  • 通常情况下不用绘制
  • 会调用 dispatchDraw() 方法俩绘制其子View,遍历所有子View并调用子View的绘制方法来完成绘制工作。

六、自定义View

  • 在自定义View时,重写onDraw()方法来绘制View的显示内容,若View使用 wrap_content 属性,还必须重写 onMeasure()方法
  • 在View中通常有一下一些比较重要的回调方法:
        1) onFinishInflate():从xml加载后回调
        2) onSizeChanged():组件大小改变时回调
        3) onMeasure():回调该方法来进行测量
        4) onLayout():回调该方法来确定显示的位置
        5) onTouchEvent():监听到触摸事件时回调
  • 通常情况下有一下三种方法来实现自定义的控件
        1) 对现有控件进行拓展
        2) 通过组合来实现新的控件
        3) 重写View来实现全新的控件

1、对现有控件进行拓展

  • 非常重要的自定义控件方法,在原生控件的基础上进行拓展

2、创建复合控件

  • 可以很好的创建出具有重用功能的控件集合

猜你喜欢

转载自blog.csdn.net/weixin_38515203/article/details/82885001
今日推荐