自定义控件的绘制流程和测量规则

1、组合控件

把原生的控件组合到自己的容器或者布局中( 视差效果的ListView+ImageView)

2、完全自定义控件

1、继承View (实现onMeasure( ) 、onLayout( )、onDraw( ) )

2、继承ViewGroup  实现onMeasure( ) 、onLayout( )

View:是一个ui组件,有一个矩形区域,用来绘制内容和处理触摸事件。
ViewGroup:是一个容器,可以保护其他的控件,负责给子控件设置位置。

3、继承现有控件,覆盖或者增加方法,提供比原生控件更多的功能 (自定义DrawerLayout)

#### 测量

12-06 14:32:09.275: E/AndroidRuntime(17568): java.lang.IllegalStateException:
onMeasure() did not set the measured dimension by calling setMeasuredDimension()

onMeasure()方法中必须调用setMeasuredDimension设置自己的宽高

// EXACTLY 指确定的宽高 父容器根据子控件的layout_width传递过来的宽高
// AT_MOST 指要求孩子最多能设置的宽高
// UNSPECIFIED 指对孩子没有要求,可以随意设置宽高

#### 布局

给子控件设置位置

// left 相对于父容器的左边界
// top 相对于父容器的上边界
// right 相对于父容器的右边界
// bottom 相对于父容器的下边界
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
System.out.println("onLayout");
super.onLayout(changed, left, top, right, bottom);

}

#### 绘制

@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);

通过设置paint的属性可以设置线的粗细,和填充颜色等
// 绘制线
// canvas.drawLine(0, 0, 200, 200, paint);
// 绘制圆 
// canvas.drawCircle(100, 100, 100, paint);

// 绘制三角形
// canvas.drawPath(path, paint);

// 绘制图片
// canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 0, 0, null);

// 绘制圆弧
float angel = progress*360f/100;
canvas.drawArc(oval, 0, angel, false, paint);
}

测量规则:父控件有的大小尽量给子控件,给不了只能给父控件所具有的大小

时间: 2024-10-05 20:14:13

自定义控件的绘制流程和测量规则的相关文章

Android自定义控件 ----- 基本绘制流程,简单控件的实现

一.自定义控件(一) --- 自定义属性TextView 1,定义属性,制作attrs.xml文件: 属性值: string,color,attr,array,bool,declare-styleable,dimen,drawable,eat-comment,fraction, integer,integer-array,item,plurals,string-array,style 属性取值范围: string,color,demension,integer,enum,reference,fl

Android View 绘制流程(Draw) 完全解析

前言 前几篇文章,笔者分别讲述了DecorView,measure,layout流程等,接下来将详细分析三大工作流程的最后一个流程--绘制流程.测量流程决定了View的大小,布局流程决定了View的位置,那么绘制流程将决定View的样子,一个View该显示什么由绘制流程完成.以下源码均取自Android API 21. 从performDraw说起 前面几篇文章提到,三大工作流程始于ViewRootImpl#performTraversals,在这个方法内部会分别调用performMeasure

自定义控件知识储备-View的绘制流程

在自定义控件这个学习系列里,首先写篇文章记录一下View的绘制流程,压压惊:-P.也为以后的自定义控件实践打个基础.虽然讲解View工作流程的文章很多,其中不乏很多精品文章,不过自己能从中理清思路,以自己之言总结出来,也是十分必要的.好的,我要开始装-不,总结了. 1. 前言 当我们打开手机,开始看朋友圈,刷微博的时候,我们有考虑过在我们眼前的一个个View是如何从无到有的展示在我们眼前的么?有考虑过它们的感受么?(神经病才去考虑(ノ??)ノ彡┻━┻--). 当我们在一张纸上画画的时候,哪怕是简

Android自定义控件_View的绘制流程

每一个View/ViewGroup的显示都会经过三个过程:1.measure过程(测量View显示的大小,位置):2.layout过程(布局view的位置):3.draw过程(上一篇文章说到的通过canvas绘制到界面上显示,形成了各色的View) 下面分析一下各个过程:measure过程: 因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌View或ViewG

自定义View_1_关于View,ViewGroup的测量和绘制流程

自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到底高深在什么地方.使用自定义View可以实现不同的效果,比原生控件更加的灵活,当然难度也是大大的加大了,但是不要怕,我们一起慢慢学习,看透他,也就那么点事.好了,不废话了进入我们的正题吧! Android自定义控件的意思就是说我们把我们想要绘制的View显示在屏幕上,并且可以使他有某种功能,这就是一

Android View的绘制流程

View 绘制机制 1. View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw.整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure).是否需要重新安置视图的位置(layout).以及是否需要重绘(draw),流程图如下: Vi

公共技术点之 View 绘制流程

公共技术点之 View 绘制流程   项目:,分析者:lightSky,校对者:Trinea 本文为 Android 开源项目源码解析 公共技术点中的 View 绘制流程 部分 分析者:lightSky View 绘制机制 1. View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw.整个 View 树的绘图流程在ViewRoot.java类的perfo

Android_View_View绘制流程

1. View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw .整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure).是否需要重新安置视图的位置(layout).以及是否需要重绘(draw),流程图如下: View 绘制流程函数调

Android视图View绘制流程与源码分析(全)

来源:[工匠若水 http://blog.csdn.net/yanbober] 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(