标签:
Custom Components
Android提供了构建您的用户界面的基础上,基本布局类一个复杂的和强大的组件化的模式:查看和ViewGroup中。分别称为widgets和布局 - - 首先,该平台包括各种预建观的ViewGroup子类,你可以用它来构建你的UI。
可用的widget的部分名单包括Button
, TextView
,EditText
, ListView
, CheckBox
, RadioButton
, Gallery
,Spinner
,和多个专用AutoCompleteTextView,ImageSwitcher和Textwatcher。
间可用的布局的LinearLayout,的FrameLayout,RelativeLayout的,等等。有关更多示例,请参见常见布局对象。
如果没有一个预定义的部件或布局满足您的需求,您可以创建自己的视图子类。如果你只需要进行小的调整,以现有的部件或布局,你可以简单地继承Widget或布局,并覆盖它的方法。
创建自己的子视图使您的屏幕元素的外观和功能的精确控制。为了让你自定义视图得到控制的想法,这里有你可以和他们做一些例子:
您可以创建一个完全自定义的渲染视图类型,例如“音量控制”旋钮使用2D图形渲染,以及它类似于一个模拟电子控制。
你可以一组View组件组合成一个新的单一成分,也许是为了让像一个ComboBox,双窗格中选择控制(左,右窗格中,在列表(弹出列表,并可以免费进入文本字段的组合)每次在那里你可以重新分配该项目是在哪个列表),依此类推。
你可以覆盖一个EditText组件的屏幕上呈现的方式(记事本教程使用这种效果良好,营造成荫,记事本页面)。
你可以捕获其他事件,如按键,并在一些自定义的方式处理它们(如游戏)。
下面的章节解释如何创建自定义视图和在应用程序中使用它们。有关详细的参考信息,请查看类。
其基本做法
下面是你需要知道要创建自己的View组件开始什么高度概括:
扩展现有的视图类或子类用自己的类。
一些覆盖从超类中的方法。这些超类方法重写开始与“开”,例如,的onDraw(),onMeasure()和的onkeydown()。这类似于上......事件活动或ListActivity你覆盖生命周期和其他功能挂钩。
使用新的扩展类。一旦完成,新的扩展类来代替它所依据的视图的使用。
提示:扩展类可以被定义为使用它们的活动里面的内部类。因为它控制对它们的访问,但没有必要的(也许您要创建在应用程序中更广泛地使用新的公共视图),这非常有用。
完全定制的组件
完全定制的组件可以用于创建却出现你想要的图形组件。也许一个图形化的VU表,看起来像一个老的模拟计,或者反弹球沿着移动的话,所以你可以将它与卡拉OK机唱唱一个长文本视图。无论哪种方式,你想要的东西,内置组件也做不了,无论你如何将它们结合起来。
幸运的是,你可以轻松地创建,看起来和任何你喜欢的方式行事成分,也许只有你的想象力,屏幕的大小和可用的处理能力(请记住,最终您的应用程序可能需要与显著少一些运行限制功率比你的桌面工作站)。
要创建一个完全定制的组件:
你可以扩展最通用的观点是,勿庸置疑,景观,所以你通常会通过扩展此创建新的超级组件启动。
可以提供一个构造可以采取属性和参数从XML,并且还可以消耗自己的这样的属性和参数(可能的颜色和范围的VU表的,或宽度和针的阻尼等)
你可能会想在你的组件类来创建自己的事件监听器,属性访问和修改,并可能更复杂的行为为好。
您将几乎肯定要覆盖onMeasure(),并也有可能需要重写的onDraw()如果您希望组件显示的东西。虽然双方都有默认的行为,默认的onDraw()会做什么,和默认onMeasure()将始终设置大小为100x100 - 这可能不是你想要的。
其他的方法...根据需要也可覆盖。
延伸的onDraw()和onMeasure()
该的onDraw()方法提供你一个帆布赖以你可以实现你想要的任何东西:2D图形,其他标准或自定义组件,样式文本,或者其他任何你能想到的。
注意:此并不适用于3D图形。如果你想使用3D图形,你必须扩展SurfaceView,而不是视图,从一个单独的线程借鉴。详情请参阅GLSurfaceViewActivity样本。
onMeasure()是一个涉及多一点。 onMeasure()是你的组件和它的容器之间的合同渲染的关键部分。 onMeasure()应该被重写,高效,准确地报告其包含部分的测量。这是通过限制从父的要求(这是在传递到onMeasure()方法)和由一旦已经计算调用setMeasuredDimension()方法测得的宽度和高度的要求稍微更复杂的。如果无法从调用一个重写的onMeasure()方法,该方法,其结果将是测量时间的异常。
在一个较高的水平,实现onMeasure()看起来是这样的:
重写的onMeasure()方法被调用,宽度和高度的度量规范(widthMeasureSpec和heightMeasureSpec参数,无论是代表尺寸整数代码),它应被视为对应产生的宽度和高度测量值的限制的要求。一个完整的参考样的这些规范可以要求限制,可以在参考文档中View.onMeasure(INT,INT)(本参考文档不解释,以及整个测量操作的一个不错的工作)下找到。
组件的onMeasure()方法应该计算出测量的宽度和高度,这将需要呈现组件。它应尽量留传入的规范之内,尽管它可以选择超过他们(在这种情况下,家长可以选择做什么,包括剪切,滚动,抛出一个异常,或要求onMeasure()再次尝试,也许不同的测量规格)。
一旦宽度和高度被计算,所述setMeasuredDimension(INT宽度,诠释高度)方法必须与计算出的测量结果被调用。如果不这样做将导致抛出异常。
下面是一些该框架的意见呼吁其他标准方法的总结:
Category | Methods | Description |
---|---|---|
Creation | Constructors | There is a form of the constructor that are called when the view is created from code and a form that is called when the view is inflated from a layout file. The second form should parse and apply any attributes defined in the layout file. |
|
Called after a view and all of its children has been inflated from XML. | |
Layout |
|
Called to determine the size requirements for this view and all of its children. |
|
Called when this view should assign a size and position to all of its children. | |
|
Called when the size of this view has changed. | |
Drawing |
|
Called when the view should render its content. |
Event processing |
|
Called when a new key event occurs. |
|
Called when a key up event occurs. | |
|
Called when a trackball motion event occurs. | |
|
Called when a touch screen motion event occurs. | |
Focus |
|
Called when the view gains or loses focus. |
|
Called when the window containing the view gains or loses focus. | |
Attaching |
|
Called when the view is attached to a window. |
|
Called when the view is detached from its window. | |
|
Called when the visibility of the window containing the view has changed. |
<view class="com.android.notepad.NoteEditor$MyEditText" id="@+id/note" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:drawable/empty" android:padding="10dip" android:scrollbars="vertical" android:fadingEdge="vertical" />定制组件被创建为在XML的通用视图,并使用完整的包中指定的类。还要注意的是我们定义的内部类是使用说明编辑引用$我的EditText符号是指内部类Java编程语言的标准方法。
<com.android.notepad.MyEditText id="@+id/note" ... />请注意的EditText类现在是一个单独的类文件。当类被嵌套在注释编辑器类,这种技术将无法正常工作。
Android API Guides---Custom Components
标签:
原文地址:http://blog.csdn.net/qq_21413973/article/details/51178656