1、Android自定义ViewAndroid高手进阶教程(三)之-Android 中自定义View的应用. 2010-04-18 21:11:25标签:Android 进阶 View 定义 教程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码:view plaincopy to clipboardprint?1. 2. 7. 12. 13. 14. 19. 24. 当然上面的布局方式可以帮助我们完成
2、简单应用的开发了,但是如果你想写一个复杂的应用,这样就有点牵强了,大家不信可以下源码都研究看看,高手写的布局方式,如上面的布局高手通常是这样写的:view plaincopy to clipboardprint?1. 2. 3. 4. 5. 6. 7. 8. view plaincopy to clipboardprint?其中A extends LinerLayout, B extends TextView. 其中A extends LinerLayout, B extends TextView.为了帮助大家更容易理解,我写了一个简单的Demo ,具体步骤如下:首先新建一个Android 工
3、程 命名为ViewDemo .然后自定义一个View 类,命名为MyView(extends View) .代码如下:1. viewplaincopytoclipboardprint? 2. packagecom.android.tutor; 3. importandroid.content.Context; 4. importandroid.graphics.Canvas; 5. importandroid.graphics.Color; 6. importandroid.graphics.Paint; 7. importandroid.graphics.Rect; 8. importand
4、roid.graphics.Paint.Style; 9. importandroid.util.AttributeSet; 10. importandroid.view.View; 11. publicclassMyViewextendsView 12. privatePaintmPaint; 13. privateContextmContext; 14. privatestaticfinalStringmString=WelcometoMrWeisblog; 15. 16. publicMyView(Contextcontext) 17. super(context); 18. 19. 2
5、0. publicMyView(Contextcontext,AttributeSetattr) 21. 22. super(context,attr); 23. 24. 25. Override 26. protectedvoidonDraw(Canvascanvas) 27. /TODOAuto-generatedmethodstub 28. super.onDraw(canvas); 29. 30. mPaint=newPaint(); 31. 32. /设置画笔颜色 33. mPaint.setColor(Color.RED); 34. /设置填充 35. mPaint.setStyl
6、e(Style.FILL); 36. 37. /画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标 38. canvas.drawRect(newRect(10,10,100,100),mPaint); 39. 40. mPaint.setColor(Color.BLUE); 41. /绘制文字 42. canvas.drawText(mString,10,110,mPaint); 43. 44. 45. packagecom.android.tutor; 46. importandroid.content.Context; 47. importandroid.graphics.Canv
7、as; 48. importandroid.graphics.Color; 49. importandroid.graphics.Paint; 50. importandroid.graphics.Rect; 51. importandroid.graphics.Paint.Style; 52. importandroid.util.AttributeSet; 53. importandroid.view.View; 54. publicclassMyViewextendsView 55. privatePaintmPaint; 56. privateContextmContext; 57.
8、privatestaticfinalStringmString=WelcometoMrWeisblog; 58. 59. publicMyView(Contextcontext) 60. super(context); 61. 62. 63. publicMyView(Contextcontext,AttributeSetattr) 64. 65. super(context,attr); 66. 67. 68. Override 69. protectedvoidonDraw(Canvascanvas) 70. /TODOAuto-generatedmethodstub 71. super.
9、onDraw(canvas); 72. 73. mPaint=newPaint(); 74. 75. /设置画笔颜色 76. mPaint.setColor(Color.RED); 77. /设置填充 78. mPaint.setStyle(Style.FILL); 79. 80. /画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标 81. canvas.drawRect(newRect(10,10,100,100),mPaint); 82. 83. mPaint.setColor(Color.BLUE); 84. /绘制文字 85. canvas.drawText(mString,1
10、0,110,mPaint); 86. 87. 88. 89. 然后将我们自定义的View加入到main.xml布局文件中,代码如下: 90. viewplaincopytoclipboardprint? 91. 92. 97. 102. 106. 107. 108. 113. 118. 122. 最后执行之,效果如下图:OK,大功告成,今天就写到这里,开始做饭了,老婆孩子等我做饭了,lol对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下。 1.
11、 CwjView myView=new CwjView(context);复制代码如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比如 1. 复制代码当然,我们也可以直接从父类声明比如 1. 复制代码上面我们仅用了父类View的两个属性,均来自android命名空间,而名称为layout_width或layout_height,我们自定义的控件可能有更多的功能,比如 1. 复制代码我们可以看到上面的三个属性,是我们自定义的。作为标准xml规范,可能还包含了类似 xmlns:
12、android= 这样的语句,对于定义完整的View,我们的命名空间为cwj,这里可以写为 xmlns:cwj= 或 xmlns:cwj= 都可以。对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如下 1. 2. 3. 4. 5. 6. 7. 8. 复制代码这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如 RatingBar的值可能是3.5颗星,
13、boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有 dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用+id/cwj drawable/xxx这样的类型。当然什么时候用reference呢? 我们就以定义一个颜色为例子, 1. 复制代码这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用当然,对于我们自定义的类中,我们需要使用
14、一个名为obtainStyledAttributes的方法来获取我们的定义。在我们自定义View的构造方法(Context context, AttributeSet attrs)的重载类型中可以用 1. public CwjView(Context context, AttributeSet attrs) 2. super(context, attrs);3. TypedArray a = context.obtainStyledAttributes(attrs,4. R.styleable.cwj_attr);5. mAge = a.getInteger(R.styleable.CwjVi
15、ew_age, 22);6. mCity = a.getString(R.styleable.CwjView_city, shanghai);7. mUniversity= a.getString(R.styleable.CwjView_university, sjtu);8. 9. a.recycle(); /Android123提示大家不要忘了回收资源10. 11. 复制代码这样类的全局成员变量 mAge、mCity就获取了我们需要的内容,当然根据layout中的数值我们自定义的CwjView需要动态的处理一些数据的情况,可以使用AttributeSet类的getAttributeReso
16、urceValue方法获取。 1. public CwjView(Context context, AttributeSet attrs)2. 3. super(context, attrs);4. resId = attrs.getAttributeResourceValue(.android123.CwjView, age, 100); 5. resId = attrs.getAttributeResourceValue(.android123.CwjView, city, shanghai);6. /resID就可以任意使用了7. 复制代码以上两种方法中,参数的最后一个数值为默认的,如果
17、您有不明白的地方可以来函到 android123 我们会在第一时间回复。(文/Android开发网)Android 自定义View2009年10月13日 星期二 18:12在values/attrs.xml中:编写MyView.java,继承Viewpackage test.cuntomizedview;import java.util.Calendar;import test.cuntomizedview.R;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.SystemClock;import android.util.AttributeSet;import android.view.View;public class MyView extends View
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2