浅谈自定义控件

当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资源  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值