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

本文深入解析了Android控件架构及自定义控件方法,包括View树结构、UI界面架构、View测量与绘制流程等,并提供了自定义View的具体实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Android控件架构

这里写图片描述

  上图为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位表示的是测量的大小,使用位运算是为了提高并优化效率.

   测量的模式:

这里写图片描述

  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() : 监听到触摸事件时回调

实现自定义的方法

这里写图片描述

首先介绍对现有控件进行扩展的方法
一个简单的例子(效果图):

这里写图片描述

实现原理分析:从图中可以看出是继承自TextView,在绘制文字之前绘制两个背景,一个尺寸为控件的尺寸,一个对控件的上下左右都存在偏移
详解地址:自定义View之继承TextView绘制背景
稍复杂一点的TextView,闪动的TextView
效果图

这里写图片描述

详解地址:Android自定义View之绘制闪动的文字
组合现有的组件实现新的组件
仿电商项目的顶部栏
效果图:

仿电商项目的顶部栏

详解地址:Android自定义View之组合控件-仿电商app顶部栏
剩下的下次再补~
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值