上次讲的自定义控件刷新点屏幕的任意地方都会刷新,而且在xml里自定义控件下面放一个textview的话,这个TextView是显示不出来的,不只这个,以前的几个自定义控件都是

为什么呢?今天来讲下onMeasure()

在自定义刷新控件的基础上重写onMeasure方法

根据上一篇自定义组件修改

注释在代码里

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:orientation="vertical"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. >
  6. <xue.test.CusView3
  7. android:id="@+id/cusview3"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. >
  11. </xue.test.CusView3>
  12. <TextView
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="我终于出现了" />
  16. </LinearLayout>

这里的TextView无法显示,想要显示的话,要测量控件的大小

  1. public class CusView3 extends View {
  2. private int color = 0;
  3. private String text = "点击我刷新";
  4. private Paint mPaint;
  5. private int mAscent;
  6. public CusView3(Context context, AttributeSet attrs) {
  7. super(context, attrs);
  8. mPaint = new Paint();
  9. mPaint.setStyle(Style.FILL);
  10. mPaint.setTextSize(35.0f);
  11. setPadding(20, 60, 0, 0); //设置padding
  12. }
  13. @Override
  14. protected void onDraw(Canvas canvas) {
  15. super.onDraw(canvas);
  16. if (color > 2) {
  17. color = 0;
  18. }
  19. switch (color) {
  20. case 0:
  21. mPaint.setColor(Color.GREEN);
  22. break;
  23. case 1:
  24. mPaint.setColor(Color.RED);
  25. break;
  26. case 2:
  27. mPaint.setColor(Color.BLUE);
  28. break;
  29. default:
  30. break;
  31. }
  32. canvas.drawText(text, getPaddingLeft(), getPaddingTop(), mPaint);
  33. }
  34. public void changeColor() {
  35. color++;
  36. }
  37. /**
  38. * 比onDraw先执行
  39. *
  40. * 一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
  41. * 一个MeasureSpec由大小和模式组成
  42. * 它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
  43. *              EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
  44. *              AT_MOST(至多),子元素至多达到指定大小的值。
  45. *
  46. *   它常用的三个函数:   
  47. * 1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
  48. * 2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)
  49. * 3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)
  50. */
  51. @Override
  52. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  53. setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
  54. }
  55. private int measureWidth(int measureSpec) {
  56. int result = 0;
  57. int specMode = MeasureSpec.getMode(measureSpec);
  58. int specSize = MeasureSpec.getSize(measureSpec);
  59. if (specMode == MeasureSpec.EXACTLY) {
  60. // We were told how big to be
  61. result = specSize;
  62. } else {
  63. // Measure the text
  64. result = (int) mPaint.measureText(text) + getPaddingLeft() + getPaddingRight();
  65. if (specMode == MeasureSpec.AT_MOST) {
  66. // Respect AT_MOST value if that was what is called for by
  67. // measureSpec
  68. result = Math.min(result, specSize);// 60,480
  69. }
  70. }
  71. return result;
  72. }
  73. private int measureHeight(int measureSpec) {
  74. int result = 0;
  75. int specMode = MeasureSpec.getMode(measureSpec);
  76. int specSize = MeasureSpec.getSize(measureSpec);
  77. mAscent = (int) mPaint.ascent();
  78. if (specMode == MeasureSpec.EXACTLY) {
  79. // We were told how big to be
  80. result = specSize;
  81. } else {
  82. // Measure the text (beware: ascent is a negative number)
  83. result = (int) (-mAscent + mPaint.descent()) + getPaddingTop() + getPaddingBottom();
  84. if (specMode == MeasureSpec.AT_MOST) {
  85. // Respect AT_MOST value if that was what is called for by
  86. // measureSpec
  87. result = Math.min(result, specSize);
  88. }
  89. }
  90. return result;
  91. }
  92. }

效果图

代码 http://download.csdn.net/detail/ethan_xue/4178423

android自定义控件 onMeasure() 测量尺寸的更多相关文章

  1. android自定义控件onMeasure方法

    1.自定义控件首先定义一个类继承View 有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/ ...

  2. Android自定义控件之基本原理

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  3. Android View 如何测量

    对于Android View的测量,我们一句话总结为:"给我位置和大小,我就知道您长到那里". 为了让大家更好的理解这个结论,我这里先讲一个日常生活中的小故事:不知道大家玩过&qu ...

  4. Android自定义控件总结

    自定义控件分类: 1.使用系统控件,实现自定义的效果 2.自己定义一个类继承View ,如textView.ImageView等,通过重写相关的方法来实现新的效果 3.自己定义一个类继承ViewGro ...

  5. Android自定义控件之基本原理(一)

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  6. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

  7. Android自定义控件之自定义属性

    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...

  8. Android自定义控件1

    概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会 ...

  9. 一起来学习Android自定义控件1

    概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会 ...

随机推荐

  1. Linux新手笔记 sudo

    centos 6.4 32bit 你是也像我一样,厌烦了在root用户和个人用户之间来回切换.或者干脆直接用root用户.可以这样设置,然后在命令前加sudo 即可使用自己到密码,临时用root身份执 ...

  2. IE 弹出提示:由于无法验证发布者,所以Windows 已经阻止此软件

    由于无法验证发布者,所以Windows 已经阻止此软件 按如下步骤:1.打开Internet Explorer---菜单栏点“工具”---Internet选项--安全---自定义级别---安全设置-- ...

  3. codeforces 374D. Inna and Sequence 线段树

    题目链接 给m个数, n个操作, 一个数列, 初始为空.一共有3种操作, 在数列末尾加0, 加1, 或删除位置为a[i]的数, a[i]为初始给的m个数, 如果a[i]大于数列长度, 那么什么也不发生 ...

  4. The introduction to Web.config of ASP.NET #Reprinted#

    花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...

  5. web乱码问题

    String data = "不见青山"; ServletOutputStream sos = response.getOutputStream(); byte b[] = dat ...

  6. MVC-06 安装部署

    部署网站往往是一件麻烦事,因为在安装部署的过程中,经常有许多步骤要运行,对于许多不太熟悉IIS/SQL的新手来说,部署网站编程一件非常困难且危险的事.Visual Studio 2012在ASP.NE ...

  7. python数据库连接

    现在装python基本都内置了sqlite连接,写成如下形式即可 from sqlite3 import dbapi2 as sqlite 如果需要insert或update东西,之后的cur必须co ...

  8. 模拟美萍加密狗--Rockey2虚拟狗(一)

    目录(?)[+]   最近受朋友之托做了一个美萍智能电源控制的插件.美萍茶楼从2010版开始支持智能电源控制设备,就是开单.结账时自动开关相应房间的电器,不过官方的设备是有线的.朋友的店已经开了一段时 ...

  9. 在VPS上安裝BT軟體Transmission

    在VPS上安裝BT軟體Transmission   作者: 窮苦人家的小孩 | 2009-12-04 55 Comments   VPS 還能怎玩?! 裝Proxy,裝VPN,這還不夠,我還用來掛種子 ...

  10. poj 2153 Rank List(查找,Map)

    题目链接:http://poj.org/problem?id=2153 思路分析: 判断Li Ming的成绩排名,需要在所有的数据章查找成绩比其高的人的数目,为查找问题. 查找问题可以使用Hash表, ...