android构建自定义的视图组件
2010-05-05 18:06
579 查看
android构建自定义的视图组件
android提供了精巧和有力的组件化模型构建用户的UI部分。主要是基于布局类:View和ViewGroup。在此基础上,android平台提供了大量的预制的View和ViewGroup子类,即布局(layout)和窗口小部件(widget)。可以用它们构建自己的UI。如果没有符合你需求的预制窗口小部件,你可以创建自己的视图子类。如果只是对已存在的窗口小部件或者布局做小的调整,只需继承该类,覆盖相关的方法。
创建你自己的View子类可以更精确控制视图元素的外观和功能。
可创建完整的自定义渲染视图类型,比如创建一个2d的控制条;
可将一组视图组件合成为一个新的单一组件,比如双选的列表,选择省和市;
覆盖EditText组件,比如notepad tutorial中的示例;
捕捉其他事件比如按键事件,并执行自定义的处理方式,比如在游戏中。
基本方法
总的来说,创建自定义的视图组件步骤是:创建自己的类,继承已经存在的View类或者子类;
覆盖超类的一些方法。这些超类的方法一般以“on”开头,比如onDraw()方法等等;
使用新创建的扩展类。一旦完成,你的新扩展类就可以用于所有View使用的地方。
注意:扩展类可以定义为内部类,在你创建的Activity类之中。这很有用,因为这样可以控制外界的访问,但是这不是必须的,因为你可能需要一个public的自定义View类供更广泛的使用。
完全自定义组件
完全自定义的组件可以创建图形组件显示在你需要的任何地方。步骤如下:
可以继承的最通用的视图类是View,可以继承它创建自定义的组件超类;
可以提供构造方法,并通过xml文件获取属性值和参数;
创建自己的事件监听器,属性访问器和编辑器等等;
一般情况下会覆盖onMeasure()方法和onDraw()方法,这会让组件显示一些东西。如果都用默认的行为,onDraw()方法不做任何事情,onMeasure()方法设置一个100×100的区域;
根据需求覆盖其他on…方法。
扩展onDraw()和onMeasure()方法
onDraw()方法提供给你一个Canvas对象,在它之上可以实现任何你想要的东西,通过2d图形api。比如其他标准的后者自定义的组件,风格化的文字后者其他。注意:这里不提供3d图形api的支持。如果你需要3d图形支持,必须继承SurfaceView而不是View,并且通过单独的线程画图。可以通过GLSurfaceViewActivity实例查看详细信息。
onMeasure()方法有些麻烦。该方法是在容器和自定义组件之间渲染的重要部分。该方法覆盖,要高效率的和精确的报告被包含区域的测量值。总的来看,实现onMeasure()方法类似如下步骤:
调用已经覆盖的onMeasure()方法,传递长和宽规范参数;
自定义组件在onMeasure()方法中计算需要渲染的组件的长和宽,应该在规范参数的范围内;
一旦长和宽计算出来,必须调用setMeasuredDimension(int width, int height)方法,这步失败会导致异常的抛出。
一个自定义视图的示例
自定义视图的示例,见:LabelView该示例演示了一些自定义组件的不同方面:
继承View类,用于完全自定义组件;
参数化的构造方法,提供更多的参数,定义在xml文件中;
标准的公开方法,用于设置标签,比如setText()方法等;
覆盖onMeasure方法确定渲染的组件尺寸;
覆盖onDraw方法,在提供的canvas中画标签。
可以找到对示例的一些使用,在custom_view_1.xml文件中。
该示例运行效果:
代码
private class SpeechView extends LinearLayout {
public SpeechView(Context context, String title, String words) {
super(context);
this.setOrientation(VERTICAL);
// Here we build the child views in code. They could also have
// been specified in an XML file.
mTitle = new TextView(context);
mTitle.setText(title);
addView(mTitle, new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
mDialogue = new TextView(context);
mDialogue.setText(words);
addView(mDialogue, new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
/**
* Convenience method to set the title of a SpeechView
*/
public void setTitle(String title) {
mTitle.setText(title);
}
/**
* Convenience method to set the dialogue of a SpeechView
*/
public void setDialogue(String words) {
mDialogue.setText(words);
}
private TextView mTitle;
private TextView mDialogue;
}
List4示例截图,见:
List6示例截图,可以点击条目,出现内容,见:
修改已存在的视图类型
如果已存在的视图组件已经和你的需求相差不远,你可以只是简单的扩展该组件,只覆盖需要改变的行为。比如示例中的NotePad应用(platforms/android-1.5/samples/NotePad)。
效果如下:
在文本框视图组件(EditText)基础上,增加了横线。
相关文章推荐
- android构建自定义的视图组件onMeasure
- android构建自定义的视图组件onMeasure
- android构建自定义的视图组件
- android构建自定义的视图组件
- (转)android构建自定义的视图组件onMeasure
- android构建自定义的视图组件
- Android开发——构建自定义组件
- Android 视图组件的自定义
- Android开发——构建自定义组件
- Android开发——构建自定义组件【转】
- Android 两种为自定义组件添加属性的使用方法和区别
- android 打包自己的自定义组件成JAR包
- Android 开源组件PagerBottomTabStrip 快速构建底部导航栏
- android自定义视图之类似淘宝商品详情
- android反射组件 (一)java 自定义annotation基础知识
- Android 的自定义Spinner组件实现方式
- Android自定义组件
- Android定制组件之图文 (自定义组件图) + TableLayout属性
- 全新 Android 构建组件到底有多好用?
- Android自定义组件系列【10】——随ViewPager滑动的导航条