1,onSizeChanged

  触发:

    当view的第一次分配大小或以后大小改变时的产生的事件。

  工作:

    计算绘制内容的位置,面积等相关值。避免每次在onDraw中计算了。

  注意:

    计算时不要忘记padding。这是个责任。

  示范:    

        // Account for padding
float xpad = (float)(getPaddingLeft() + getPaddingRight());
float ypad = (float)(getPaddingTop() + getPaddingBottom()); // Account for the label
if (mShowText) xpad += mTextWidth; float ww = (float)w - xpad;
float hh = (float)h - ypad; // Figure out how big we can make the pie.
float diameter = Math.min(ww, hh);

2,onMeasure

  触发:

    当父控件布局时,要测量子控件的大小,当调用子控件measure要求强制测量或实在无法确定其大小时(先是上次MeasureSpec值不同,再是缓存中找不到对应值),触发子控件onMeasure,子控件在其中确定和部分绘制内容的大小。

  见: http://www.cnblogs.com/sjjg/p/5193909.html

  工作:

    解析传来的参数,设置各绘制内容大小。

  注意:

    a,传来的参数是长宽的压缩值,要解析后只是最大或建议的大小,可以在onMeasure中指定最大范围内的值。

    b,并且必需调用 setMeasuredDimension方法。

    c,不要忘记padding。这是个责任。

  示范:

     @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Try for a width based on our minimum
//最小宽度
int w = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth(); //如果给出的建议是0,可以手动设置一个期望值。单位是像素。同时这步一定要在resolveSizeAndState前,
// 因为它可能大于widthMeasureSpec的最大值。
if (w == ) w = ; //计算最佳值,在其中解析了 widthMeasureSpec
w = resolveSizeAndState(w, widthMeasureSpec, ); // Whatever the width ends up being, ask for a height that would let the pie
// get as big as it can
//最小高度
int h = getSuggestedMinimumHeight() + getPaddingBottom() + getPaddingTop(); //如果给出的建议是0,可以手动设置一个期望值。单位是像素。同时这步一定要在resolveSizeAndState前,
// 因为它可能大于heightMeasureSpec的最大值。
if (h == ) h = ; //计算最佳值,在其中解析了 heightMeasureSpec
h = resolveSizeAndState(h, heightMeasureSpec, ); //将量算的结果保存到View的成员变量mMeasuredWidth 和mMeasuredHeight中。
setMeasuredDimension(w, h); // 量算完成之后,View的父控件就可以通过调用
// getMeasuredWidth、getMeasuredState、getMeasuredWidthAndState
// 这三个方法获取View的量算结果。 } 

3,onDraw

  触发:

    绘制事件,绝大多数时是由于调用invalidate()触发。

  工作:

    绘制点,线,图形,路径,图片等。

  注意:

    这个方法调用频度非常高,不要在里面申请内存,不要绘制时间过长,不要重复计算等。少调用invalidate()。

  示范:

 protected void onDraw(Canvas canvas) {
super.onDraw(canvas); // Draw the shadow
canvas.drawOval(
mShadowBounds,
mShadowPaint
); // Draw the label text
canvas.drawText(mData.get(mCurrentItem).mLabel, mTextX, mTextY, mTextPaint); // Draw the pie slices
for (int i = ; i < mData.size(); ++i) {
Item it = mData.get(i);
mPiePaint.setShader(it.mShader);
canvas.drawArc(mBounds,
- it.mEndAngle,
it.mEndAngle - it.mStartAngle,
true, mPiePaint);
} // Draw the pointer
canvas.drawLine(mTextX, mPointerY, mPointerX, mPointerY, mTextPaint);
canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);
}

自定义View(10)*onSizeChanged,onMeasure,onDraw的注意事项及正确写法的更多相关文章

  1. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  2. 自定义View(四),onMeasure

    转自:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--on ...

  3. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  4. 自定义View(7)draw与onDraw区别

    draw()这个函数本身会做很多事情,可参看源码.         *      1. Draw the background         *      2. If necessary, save ...

  5. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  6. 从一个简洁的进度刻度绘制中了解自定义View的思路流程

    先看效果(原谅我的渣像素),进度的刻度.宽度.颜色可以随意设定: [项目github地址: https://github.com/zhangke3016/CircleLoading] 实现起来并不难, ...

  7. Android 自定义 View 圆形进度条总结

    Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...

  8. Android之自定义View以及画一个时钟

    https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...

  9. 自定义View完全解析

    自定义View主要包括以下3种方式: 一.组合控件,利用已有控件的组合,来满足自己的需求. 例子:顶部导航栏 二.继承已有View,比如继承TextView.ImageView等,根据需要重写相应的方 ...

随机推荐

  1. [NOIP2007] 提高组 洛谷P1099 树网的核

    题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...

  2. Linux下C编程入门(7)

    Linux下项目同步工具介绍git和github 一.远程仓库工具github 1. 一.本地操作工具git 1.

  3. hdu - 1150 Machine Schedule (二分图匹配最小点覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两种机器,A机器有n种模式,B机器有m种模式,现在有k个任务需要执行,没切换一个任务机器就需要重启一次, ...

  4. [bzoj2506]calc_分块处理

    calc bzoj-2506 题目大意:给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个 ...

  5. iis站点内存泄漏问题分析

    在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...

  6. Nginx+Tomcat+Memcached负载均衡和session共享

    1. 演示搭建 说明:本文参考网络日志http://blog.csdn.net/remote_roamer/article/details/51133790,结合实际操作,仅做个演示记录. 1.1.  ...

  7. [52ABP系列] - 001、SPA免费项目模版搭建教程

    前言 这个项目是基于 ABP ASPNetCore 免费版,整合 NG-Alian 和 NG-Zorro 的项目,所以比较适合熟悉 ABP 和 Angular2+ 的开发人员, 如果你是新手,学习的话 ...

  8. Andorid使用WiFi 连接adb进行调试

    无奈数据线连接常常掉线. 于是寻找wifi连接adb的方法,在github上搜索了一下client的源代码后编译后执行了下,发现能够行得通,于是记录一下. 相应的安卓client源代码在这wifi a ...

  9. 如何使用TFTP客户端工具修复路由器固件

    如何使用TFTP客户端工具修复路由器固件 编号:12083       来自:NetGear       更新日期:2013-10-14       访问数量:24650 NETGEAR无线路由器中, ...

  10. AngularJS $q 和 $q.all 单个数据源和多个数据源合并(promise的说明)

    这篇文章讲的不错, angular $q  和 promise!! -------------------------------------------------------------- 通过调 ...