设为首页 加入收藏

TOP

Android 自定义View步骤(一)
2015-08-31 21:25:25 来源: 作者: 【 】 浏览:209
Tags:Android 定义 View 步骤

1 良好的自定义View


易用,标准,开放。


一个设计良好的自定义view和其他设计良好的类很像。封装了某个具有易用性接口的功能组合,这些功能能够有效地使用CPU和内存,并且十分开放的。但是,除了开始一个设计良好的类之外,一个自定义view应该:


Android框架提供了一套基本的类和XML标签来帮您创建一个新的,满足这些要求的view。忘记提供属性和事件是很容易的,尤其是当您是这个自定义view的唯一用户时。请花一些时间来仔细的定义您view的接口以减少未来维护时所耗费的时间。一个应该遵从的准则是:暴露您view中所有影响可见外观的属性或者行为。


2 创建自定义View (步骤)


2.1 继承View完全自定义或继承View的派生子类


必须提供一个能够获取Context和作为属性的AttributeSet对象的构造函数,获取属性,当view从XML布局中创建了之后,XML标签中所有的属性都从资源包中读取出来并作为一个AttributeSet传递给view的构造函数。


View 派生出来的直接或间接子类:ImageView, Button, CheckBox, SurfaceView, TextView, ViewGroup, AbsListView


ViewGourp 派生出来的直接或间接子类:AbsoluteLayout, FrameLayout, RelativeLayout, LinearLayout


所有基类、派生类都是Android framework层集成的标准系统类, 可直接引用SDK中这些系统类及其API


2.2 定义自定义属性


在资源元素中为您的view定义自定义属性。


在项目组添加资源。这些资源通常是放在res/values/attrs.xm文件里。如下是attrs.xml文件的一个例子:


resources>;


?


? ? ?


? ? ?


? ? ? ? ?


? ? ? ? ?


? ? ?


?



在您的XML布局中使用指定属性的值。


布局XML文件中可以像内建属性一样使用它们。唯一不同是自定义属性属于不同的命名空间。


http://schemas.android.com/apk/res/[你的自定义View所在的包路径]




xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">



?custom:showText="true"


?custom:labelPosition="left" />



在运行时取得属性值。


将取回的属性值应用到您的view中。


2.3 获取自定义属性


当view从XML布局中创建了之后,XML标签中所有的属性都从资源包中读取出来并作为一个AttributeSet传递给view的构造函数。尽管从AttributeSet中直接读取值是可以的,但是这样做有一些缺点:


带有值的资源引用没有进行处理


样式并没有得到允许


取而代之的是,将AttributeSet传递给obtainStyledAttributes()方法。这个方法传回了一个TypedArray数组,包含了已经解除引用和样式化的值。


为了时能能够更容易的调用obtainStyledAttributes()方法,Android资源编译器做了大量的工作。res文件夹 中的每个资源,生成的R.java都定义了一个属性ID的数组以及一套定义了指向数组中的每一个属性 的常量。您可以使用预定义的常量从TypedArry中读取属性。下例是PieChart类是如何读取这些属性的:


public PieChart(Context ctx, AttributeSet attrs) {


super(ctx, attrs);


TypedArray a = context.getTheme().obtainStyledAttributes(


attrs,


R.styleable.PieChart,


0, 0);


try {


mShowText = a.getBoolean(R.styleable.PieChart_showText, false);


mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);


} finally {


a.recycle();


}


}


注意,TypedArry对象是一个共享的资源,使用完毕必须回收它。


2.4 添加属性和事件


属性是控制view的行为和外观的强有力的方式,但是只有view在初始化后这些属性才可读。为了提供动态的行为,需要暴露每个自定义属性的一对getter和setter。下面的代码片段显示PieChart是如何提供showText属性的。


public boolean isShowText() {


return mShowText;


}


public void setShowText(boolean showText) {


mShowText = showText;


invalidate();


requestLayout();


}


注意,setShowText调用了invalidate()和requestLayout()。这些调用关键是为了保证view行为是可靠的。你必须在改变这个可能改变外观的属性后废除这个view,这样系统才知道需要重绘。同样,如果属性的变化可能影响尺寸或者view的形状,您需要请求一个新的布局。忘记调用这些方法可能导致难以寻找的bug。


自定义view同样需要支持和重要事件交流的事件监听器。


2.5 自定义绘制(实施)


绘制自定义视图里最重要的一步是重写onDraw()方法. onDraw()的参数是视图可以用来绘制自己的Canvas对象. Canvas定义用来绘制文本、线条、位图和其他图像单元. 你可以在onDraw()里使用这些方法创建你的自定义用户界面(UI).


android.graphics框架把绘图分成了两部分:


画什么, 由Canvas处理


怎么画, 由Paint处理


例如, Canvas提供画线条的方法, 而Paint提供定义线条颜色的方法. Canvas提供画矩形的方法, 而Paint定义是否用颜色填充矩形或让它为空. 简而言之, Canvas定义你可以在屏幕上画的形状, 而Paint为你画的每个形状定义颜色、样式、字体等等.


onDraw()不提供3d图形api的支持。如果你需要3d图形支持,必须继承SurfaceView而不是View,并且通过单独的线程画图。


3 优化


3.1 降低刷新频率


为了提高view的运行速度,减少来自于频繁调用的程序的不必要的代码。从onDraw()方法开始调用,这会给你带来最好的回报。特别地,在onDraw()方法中你应该减少冗余代码,冗余代码会带来使你view不连贯的垃圾回收。初始化的冗余对象,或者动画之间的,在动画运行时,永远都不会有所贡献。


加之为了使onDraw()方法更有依赖性,你应该尽可能的不要频繁的调用它。大部分时候调用 onDraw()方法就是调用invalidate()的结果,所以减少不必要的调用invalidate()方法。有可能的,调用四种参数不同类型的invalidate(),而不是调用无参的版本。无参变量需要刷新整个view,而四种参数类型的变量只需刷新指定部分的view.这种高效的调用更加接近需求,也能减少落在矩形屏幕外的不必 要刷新的页面。


3.2 使用硬件加速


作为Android3.0,Android2D图表系统可以通过大

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Struts2结果类型(Result Types) 下一篇Android 自定义View 密码框 例子

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: