Android自定义控件初步之基本知识
来源:互联网 发布:淘宝助手 mac 编辑:程序博客网 时间:2024/06/10 01:37
由于项目的需要,最近开始学习一下自定义控件。说到这个,大家肯定吐槽:本来自定义控件是必须要会的。好吧!不能是由于项目的需要,作为安卓开发者,肯定要会自定义控件和屏幕适配。
(1)自定义控件主要包括三类:
1)继承已经有的控件来实现自定义控件。例如与某个控件的功能类似,属性都差不多,那就继承它吧。
2)组合控件。所谓组合控件就是将系统原生控件组合起来,加上动画效果,形成一个特殊的UI效果。
3)纯粹自定义控件。所谓纯粹自定义控件就是继承系统View,自己去实现View效果。
(2)自定义控件的步骤:
1)测量:onMeasure。设置自己显示在屏幕上的宽高。子类可以覆写onMeasure()方法实现自己的计算视图 大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。
2)布局:onLayout。设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到)。在View中这个函 数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的。
3)绘制:onDraw。控制显示在屏幕上的样子(自定义ViewGroup时不需要这个)。子类也不应该修改该方法 ,因为其内部定义了绘图的基本操作:
(1)绘制背景;(2)如果要视图显示渐变框,这里会做一些准备工作;(3)绘制视图本身,即调用onDraw()函数。在View中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容”的,其包含了多个子View,而子View已经实现了自己的绘制方法,因此只需要告诉子View绘制自己就可以了,也就是下面的dispatchDraw()方法;(4)绘制子视图,即dispatchDraw()函数。在View中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;(5)如果需要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),开始绘制渐变框;(6)绘制滚动条;从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。
View和ViewGroup的相同点:都需要测量(onMeasure)这一步。
不同点:View没有子View,所以不需要onLayout方法,但是必须实现onDraw。
(3)举例。下面是侧滑功能对应的代码。
onMeasure:
<pre name="code" class="java"><pre name="code" class="java"> protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //测量所有子View的宽高 //通过getLayoutParams方法可以获取到布局文件中指定宽高 menuView.measure( menuWidth, heightMeasureSpec ); //直接使用SlideMenu的测量参数,因为它的宽高都是充满父窗体 mainView.measure( widthMeasureSpec, heightMeasureSpec );}
onLayout:
protected void onLayout( boolean changed, int l, int t, int r, int b ) {menuView.layout( -menuWidth, 0, 0, menuView.getMeasuredHeight() ); mainView.layout( 0, 0, r, b ); }
由于是用ViewGroup,所以不用onDraw。
下面是XML文件:
<com.example.androidslidingmenu.view.SlideMenu android:id="@+id/slideMenu" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 菜单界面的布局 --> <include layout="@layout/layout_menu"/> <!-- 主界面的布局 --> <include layout="@layout/layout_main"/> </com.example.androidslidingmenu.view.SlideMunu>
0 0
- Android自定义控件初步之基本知识
- Android 自定义控件之测量(onMeasure)初步
- 自定义控件之初步
- android 自定义控件初步
- Android 自定义控件之2D绘图初步
- Android UI编程之自定义控件初步(下)——CustomEditText
- Android UI编程之自定义控件初步(上)——ImageButton
- Android之自定义控件
- Android之自定义控件
- android之自定义控件
- Android自定义控件之自定义日历控件
- Android自定义控件之自定义组合控件
- Android 自定义控件之自定义组合控件
- Android自定义控件之自定义组合控件
- Android入门之控件布局初步
- Android控件之SurfaceView初步了解
- Android初步之控件与布局
- Android自定义view初步——定制复合控件
- 提高单片机定时器精度的算法
- 原型模式之深浅复制
- vbs学到的几个常用函数
- javascript的流程控制
- DICOM:DICOM标准学习路线图(初稿)
- Android自定义控件初步之基本知识
- OSI七层与TCP/IP五层网络架构详解
- SparkContext类和SparkConf类
- HDU 5504 GT and sequence 模拟
- Ajax详解
- [leetcode]Reorder List
- 内存管理器(五)Glibc malloc实现(一)(概论)
- 当在浏览器地址栏输入一个URL后回车,将会发生的事情?
- [Object C]_[初级]_[NSArray排序]