Android群英传学习-第三章:控件架构与自定义控件详解

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

Android控件架构

Android群英传学习-第三章:控件架构与自定义控件详解_第1张图片

  上图为View树结构,Activity中使用的findViewById()方法,就是在控件树中以树的深度优先遍历来查找对应的元素.每棵树的顶部都有一个ViewParent对象,是整棵树的控制核心,所有的交互事件都由它统一调度和发配,从而可以对整个视图进行整体的控制.

  Activity中使用setContentView设置布局之后布局内容才能显示到屏幕上,setContentView所做的工作如下:

  上图是UI界面的架构图,每个Activity都包含一个Window对象,在Android中通常有PhoneWindow来实现,PhoneWindow将一个DecorView设置为整个应用窗口的根View.DecorView将要显示的内容呈现在PhoneWindow上,这里所有的View的监听事件都通过WindowManagerService来进行接收.而在显示上,把屏幕分成两部分,TitleViewContentView.

  在代码中,onCreate调用setContentView方法后,ActivityManagerService会回调onResume方法,此时系统才会把整个DecorView添加到PhoneWindow中,并让其显示出来,完成最终的界面的绘制.

View的测量

  Android系统为测量提供了一个功能强大的类-MeasureSpec,通过它可以获取测量的模式与测量的数据.

  MeasureSpec是一个32位的int值,其中高两位表示的是测量的模式,低30位表示的是测量的大小,使用位运算是为了提高并优化效率.

   测量的模式:

Android群英传学习-第三章:控件架构与自定义控件详解_第2张图片

  View默认的onMeasure测量模式只支持EXACTLY,如果要支持wrap_content,则必须重写onMeasure方法.

onMeasure设置大小用setMeasuredDimension(int width , int height)来设置控件的大小.

获取MeasureSpec的数据

int size = MeasureSpec.getSize(measureSpec);//获取尺寸
int mode = MeasureSpec.getMode(measutrSpec);//获取测量模式

处理wrap_content的模板(onMeasure()中);

int result = 0 ; 
int specSize = MeasureSpec.getSize(measureSpec);
int specMode = MeasureSpec.getMode(measureSpec);
if(specMode == MeasureSpec.EXACTLY){
    resulr = specSize ;
} else {
        result = 200 ; //指定最大值为200
        if(specMode == MeasureSpac.AT_MOST){
            resutl = Marh.min(result , specSize) ;
        }
}
//result 即为最终的值

View的绘制:

Canvas的绘制内容显示到Bitmap上

Canvas canvas = new Canvas(bitmap) ; 

ViewGroup的测量与放置子View

当大小为wrap_content的时候,ViewGroup的大小为能容纳下所有子view的最小值,即需要对子View进行遍历,子View位置的放置也是需要对子View进行遍历.然后调用layout来放置子View.ViewGroup不会调用onDraw方法来绘制,除非设置背景色,但是ViewGroup会调用dispatchDraw()方法来绘制其子View,其过程同样是遍历所有子View,调用子View的绘制方法来完成绘制工作.

自定义View:

常用的重要方法:

  • onFinishInflate() : 从XML加载组件后的回调
  • onSizeChaged() : 组件改变大小时回调
  • onMeasure() : 回调该方法进行测量
  • onlayout() : 回调该方法来确定显示的位置
  • onTouchEvent() : 监听到触摸事件时回调

实现自定义的方法

Android群英传学习-第三章:控件架构与自定义控件详解_第3张图片

首先介绍对现有控件进行扩展的方法

一个简单的例子(效果图):

实现原理分析:从图中可以看出是继承自TextView,在绘制文字之前绘制两个背景,一个尺寸为控件的尺寸,一个对控件的上下左右都存在偏移

详解地址:自定义View之继承TextView绘制背景

稍复杂一点的TextView,闪动的TextView

效果图

这里写图片描述

详解地址:Android自定义View之绘制闪动的文字

组合现有的组件实现新的组件

仿电商项目的顶部栏

效果图:

Android群英传学习-第三章:控件架构与自定义控件详解_第4张图片

详解地址:Android自定义View之组合控件-仿电商app顶部栏

剩下的下次再补~

你可能感兴趣的:(android,自定义view)