当Android原生的控件无法满足我们的需要时,又或者说我们想实现一个特别炫的控件,又或者说我们就是叼,就想和别人不一样,这时候我们就不得不去自己去一步一步的去创建一个控件,也就是自己定义一个控件。
说到自定义控件的实现,从当下所分的派系而言,可以衍生出三大派:
第一种实现方式就是继承已有的控件来实现自定义控件: 主要是当要实现的控件和已有的控件在很多方面比较类似, 通过对已有控件的扩展来满足要求。比如说,我想让一个TextView不仅可以添加文字也可以添加图片,那么我们就可以继承Textview控件。
第二种通过继承一个布局文件实现自定义控件,一般来说做组合控件时可以通过这个方式来实现。注意此时不用onDraw方法,在构造广告中通过inflater加载自定义控件的布局文件,再addView(view),自定义控件的图形界面就加载进来了。
第三种就是通过继承view类来实现自定义控件,使用GDI绘制出组件界面,一般无法通过上述两种方式来实现时用该方式。
说到第三种,有的同志就问了,什么是GDI?大家不妨可以百度一下,在这里我也粘贴一下GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
其实话又说回来Android的UI界面都是由View和ViewGroup及其派生类组合而成的,其中最重要的三个方法是onMeasure(int,int),onLayout(boolean,int,int,int,int),onDraw(Cancas),当然了除了这三种方法之外,还有很多方法,这里我们先主要阐述一下这三个方法是怎么个意思。
@Override
// 当系统测量view的大小的时候,调用
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 我们必须告诉系统,这个view有多大,通过调用setMeasuredDimension(width,height)
setMeasuredDimension(200,80);
}
@Override
/**
* 当系统指定view的位置后,回调 该方法 ,view的位置,由父view决定,子view只有建议权,没
有决定权
* @params changed 当前view的尺寸和位置,是否发生变化
* @params left,top,right,bottom 当前view在父view中的位置
*
*/
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
/**
* 绘制view的内容
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GREEN);
}
除了上述的主要方法之外,当然了还有很多方法,如下:
onFinishlnflate()这是一个回调方法, 当应用从 XML 布局文件加载该组件并利用它来构建界面之后, 该方法就会被回调。
onMeasure(int,int):调用该方法来检测View组件及它所包含的所有子组件的大小.
onlayout(boolean,int,int,int,int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调. View类中布局发生改变时会调用的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,重载该类可以在布局发生改变时作定制处理,这在实现一些特效时非常有用。
onSizeChanged(int,int, int, int):当该组件的大小被改变时回调该方法.
onDraw(canves): 当该组件将要绘制它的内容时回调该方法迸行绘制. View类中用于重绘的方法,这个方
法是所有View、ViewGroup及其派生类都具有的方法,也是Android UI绘制最重要的方法。开发者可 重载该方法,并在重载的方法内部基于参数canvas绘制自己的各种图形、图像效果。
onKeyDown(int,KeyEvent): 当某个键被按下时触发该方法.
onKayUp(int,KeyEvent), 当松开某个键时触发该方法.
onTrackballEvent (MotionEvent): 当发生轨迹球事件时触发该方法.
onTouchEvent (MotionEvent): 当发生触摸屏事件时触发该方法.
onWindowFocuschanged(boolean): 当该组件得到、失去焦点时触发该方法.
onAttachedToWindow():当把该组件放入某个窗口时触发该方法.
onDetachedFromWindow(): 当把该组件从某个窗口上分离时触发该方法.
onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法.
另外再补充两个ViewGroup类经常重载的方法:
1.protected void dispatchDraw(Canvas canvas):ViewGroup类及其派生类具有的方法,这个方法主要用于控制子View的绘制分发,重载该方法可改变子View的绘制,进而实现一些复杂的视效。
2.protected boolean drawChild(Canvas canvas, View child, long drawingTime)):ViewGroup 类及其派生类具有的方法,这个方法直接控制绘制某局具体的子view,重载该方法可控制具体某个具体子View。
说了各种方法之后,我们在说一说几个构造函数:构造函数里的参数有一个的,也有多个的,具体的构造的函数具体到描述的含义是什么,这里我们也简单陈述一下。
第一个构造函数: 当不需要使用xml声明或者不需要使用inflate动态加载时候,实现此构造函数即可
第二个构造函数: 当需要在xml中声明此控件,则需要实现此构造函数。并且在构造函数中把自定义的属性与控件的数据成员连接起来。
第三个构造函数: 接受一个style资源
说到自定义控件的实现,从当下所分的派系而言,可以衍生出三大派:
第一种实现方式就是继承已有的控件来实现自定义控件: 主要是当要实现的控件和已有的控件在很多方面比较类似, 通过对已有控件的扩展来满足要求。比如说,我想让一个TextView不仅可以添加文字也可以添加图片,那么我们就可以继承Textview控件。
第二种通过继承一个布局文件实现自定义控件,一般来说做组合控件时可以通过这个方式来实现。注意此时不用onDraw方法,在构造广告中通过inflater加载自定义控件的布局文件,再addView(view),自定义控件的图形界面就加载进来了。
第三种就是通过继承view类来实现自定义控件,使用GDI绘制出组件界面,一般无法通过上述两种方式来实现时用该方式。
说到第三种,有的同志就问了,什么是GDI?大家不妨可以百度一下,在这里我也粘贴一下GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
其实话又说回来Android的UI界面都是由View和ViewGroup及其派生类组合而成的,其中最重要的三个方法是onMeasure(int,int),onLayout(boolean,int,int,int,int),onDraw(Cancas),当然了除了这三种方法之外,还有很多方法,这里我们先主要阐述一下这三个方法是怎么个意思。
@Override
// 当系统测量view的大小的时候,调用
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 我们必须告诉系统,这个view有多大,通过调用setMeasuredDimension(width,height)
setMeasuredDimension(200,80);
}
@Override
/**
* 当系统指定view的位置后,回调 该方法 ,view的位置,由父view决定,子view只有建议权,没
有决定权
* @params changed 当前view的尺寸和位置,是否发生变化
* @params left,top,right,bottom 当前view在父view中的位置
*
*/
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
/**
* 绘制view的内容
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GREEN);
}
除了上述的主要方法之外,当然了还有很多方法,如下:
onFinishlnflate()这是一个回调方法, 当应用从 XML 布局文件加载该组件并利用它来构建界面之后, 该方法就会被回调。
onMeasure(int,int):调用该方法来检测View组件及它所包含的所有子组件的大小.
onlayout(boolean,int,int,int,int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调. View类中布局发生改变时会调用的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,重载该类可以在布局发生改变时作定制处理,这在实现一些特效时非常有用。
onSizeChanged(int,int, int, int):当该组件的大小被改变时回调该方法.
onDraw(canves): 当该组件将要绘制它的内容时回调该方法迸行绘制. View类中用于重绘的方法,这个方
法是所有View、ViewGroup及其派生类都具有的方法,也是Android UI绘制最重要的方法。开发者可 重载该方法,并在重载的方法内部基于参数canvas绘制自己的各种图形、图像效果。
onKeyDown(int,KeyEvent): 当某个键被按下时触发该方法.
onKayUp(int,KeyEvent), 当松开某个键时触发该方法.
onTrackballEvent (MotionEvent): 当发生轨迹球事件时触发该方法.
onTouchEvent (MotionEvent): 当发生触摸屏事件时触发该方法.
onWindowFocuschanged(boolean): 当该组件得到、失去焦点时触发该方法.
onAttachedToWindow():当把该组件放入某个窗口时触发该方法.
onDetachedFromWindow(): 当把该组件从某个窗口上分离时触发该方法.
onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法.
另外再补充两个ViewGroup类经常重载的方法:
1.protected void dispatchDraw(Canvas canvas):ViewGroup类及其派生类具有的方法,这个方法主要用于控制子View的绘制分发,重载该方法可改变子View的绘制,进而实现一些复杂的视效。
2.protected boolean drawChild(Canvas canvas, View child, long drawingTime)):ViewGroup 类及其派生类具有的方法,这个方法直接控制绘制某局具体的子view,重载该方法可控制具体某个具体子View。
说了各种方法之后,我们在说一说几个构造函数:构造函数里的参数有一个的,也有多个的,具体的构造的函数具体到描述的含义是什么,这里我们也简单陈述一下。
第一个构造函数: 当不需要使用xml声明或者不需要使用inflate动态加载时候,实现此构造函数即可
第二个构造函数: 当需要在xml中声明此控件,则需要实现此构造函数。并且在构造函数中把自定义的属性与控件的数据成员连接起来。
第三个构造函数: 接受一个style资源