千家信息网

Android中如何自定义控件view

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关Android中如何自定义控件view,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。初识ViewAndroid所有的控件都是View或者
千家信息网最后更新 2026年11月02日Android中如何自定义控件view

这篇文章将为大家详细讲解有关Android中如何自定义控件view,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

初识View

Android所有的控件都是View或者View的子类,它其实表示的就是屏幕上的一块矩形区域,用一个Rect来表示,left,top表示View相对于它的parent View的起点,width,height表示View自己的宽高,通过这4个字段就能确定View在屏幕上的位置,确定位置后就可以开始绘制View的内容了。

View的绘制过程

一般情况下大家都知道View的绘制可以分为下面三个过程:

Measure

View会先做一次测量,算出自己需要占用多大的面积。View的Measure过程给我们暴露了一个接口onMeasure,方法的定义是这样的,

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {}

View类已经提供了一个基本的onMeasure实现,

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),          getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));}public static int getDefaultSize(int size, int measureSpec) {  int result = size;  int specMode = MeasureSpec.getMode(measureSpec);  int specSize = MeasureSpec.getSize(measureSpec);  switch (specMode) {  case MeasureSpec.UNSPECIFIED:      result = size;      break;  case MeasureSpec.AT_MOST:  case MeasureSpec.EXACTLY:      result = specSize;      break;  }  return result;}

其中invoke了setMeasuredDimension()方法,设置了measure过程中View的宽高,getSuggestedMinimumWidth()返回View的最小Width,Height也有对应的方法。插几句,MeasureSpec类是View类的一个内部静态类,它定义了三个常量UNSPECIFIED、AT_MOST、EXACTLY,其实我们可以这样理解它,它们分别对应LayoutParams中match_parent、wrap_content、xxxdp。我们可以重写onMeasure来重新定义View的宽高。

Layout

Layout过程对于View类非常简单,同样View给我们暴露了onLayout方法

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {}

因为我们现在讨论的是View,没有子View需要排列,所以这一步其实我们不需要做额外的工作。

Draw

Draw过程,就是在canvas上画出我们需要的View样式。同样View给我们暴露了onDraw方法

protected void onDraw(Canvas canvas) {}

默认View类的onDraw没有一行代码,但是提供给我们了一张空白的画布,举个例子,就像一张画卷一样,我们就是画家,能画出什么样的效果,完全取决我们。

View中还有三个比较重要的方法

  1. requestLayout
    View重新调用一次layout过程。

  2. invalidate
    View重新调用一次draw过程

  3. forceLayout
    标识View在下一次重绘,需要重新调用layout过程。
    自定义属性

整个View的绘制流程我们已经介绍完了,还有一个很重要的知识,自定义控件属性,我们都知道View已经有一些基本的属性,比如layout_width,layout_height,background等,我们往往需要定义自己的属性,那么具体可以这么做。

1.在values文件夹下,打开attrs.xml,其实这个文件名称可以是任意的,写在这里更规范一点,表示里面放的全是view的属性。
2.因为我们下面的实例会用到2个长度,一个颜色值的属性,所以我们这里先创建3个属性。

      

那么到底怎么用呢,我们会看一个实例。

实现一个比较简单的Google彩虹进度条。


因为我们这里不用关注measrue和layout过程,直接重写onDraw方法即可。
其实就是调用canvas的drawLine方法,然后每次将draw的起点向前推进,在方法的结尾,我们调用了invalidate方法,上面我们已经说明了,这个方法会让View重新调用onDraw方法,所以就达到我们的进度条一直在向前绘制的效果。下面是最后的显示效果,制作成gif时好像有色差,但是真实效果是蓝色的。

关于"Android中如何自定义控件view"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

方法 过程 属性 控件 就是 效果 三个 篇文章 重要 位置 内容 实例 屏幕 文件 更多 知识 起点 进度 不错 最小 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 浩特互联网科技 天津摩尔互联网科技 沃里互联网科技 长亮科技 互联网金融 互联网科技股有哪些 天扬科技互联网广告 滨湖区互联网智能科技产品供应 深圳市运趣互联网科技有限公司 承德科技产业互联网发展 金融科技与互联网金融相同和不同 佛山市翊博互联网络科技有限公司 翼展科技 首家互联网医院 国大互联网教育科技有限公司薪资 卡尔迅互联网科技有限公司 半导体行业属于互联网高科技类吗 互联网科技平台产品运营 云南互联网科技学费 北京互联网科技类企业分布 上海互联网科技园景观 上海睿民互联网科技有限公司 互联网科技工作委员会副主任毛军 中资互联网科技 远信互联网科技 互联网科技热点资讯 厦门比较好的科技互联网公司 想开互联网科技公司怎么样 互联网科技创新的路径 有人说阿里系是互联网科技企业 卡尔迅互联网科技有限公司
0