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);
}

最新文章

  1. C#在函数内部获取函数的参数
  2. win7下安装和使用Windows XP Mode
  3. js 实现动态的图片时钟
  4. spring security 控制用户信息用户加密 缓存用户信息
  5. DELETE与TRUNCATE的区别
  6. JAVA 边界布局管理器
  7. 通过jstack定位在线执行java系统故障_案例1
  8. spring boot -Properties &amp; configuration
  9. PyJWT 使用
  10. 服务器性能调优(netstat监控大量ESTABLISHED连接与Time_Wait连接问题)
  11. pta7-18奥运排行榜(模拟)
  12. object &amp; over-write
  13. voith项目配置服务程序
  14. BestCoder Round #41 记。
  15. Django+Nginx+uwsgi搭建自己的博客(三)
  16. matlab 常用集合相关的函数
  17. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
  18. Linux rsync数据定时增量备份
  19. flink学习笔记-flink实战
  20. symbol访问法及symbor注册表

热门文章

  1. 【ZJOI2017 Round1练习&amp;BZOJ4774】D3T2 road(斯坦纳树,状压DP)
  2. QQ5.0侧滑
  3. Ubuntu 16.04无法在WPS中输入中文的问题解决
  4. u盘--软驱
  5. TensorFlow-GPU环境配置之一——安装Ubuntu双系统
  6. Linux NFS服务器的安装与配置(转载)
  7. Java这样学,Offer随便拿,学习方法和面试经验分享
  8. c++命令提示符窗体下打印指定大小的菱形代码
  9. psping
  10. MYSQL入库常用PHP函数