码迷,mamicode.com
首页 > 其他好文 > 详细

自定义View

时间:2017-10-09 14:08:25      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:focus   容器类   图结构   tac   背景   布局   包装   事件传递   dimens   

1:OnMeasuer方法   测量自定义空间的大小
2:OnDraw 方法: 绘制显示的内容
3:OnLayout: 确定现实的位置
4:OnTouch:: 确定事件触摸事件

矩形:canvas.drawRect(50,250,400,630,pa3);
第一个参数:矩形左边框距离Y轴的距离
第二个参数:矩形上边框距离X轴的距离
第三个参数:矩形右边框距离Y轴的距离
第四个参数:矩形下边框距离X轴的距离

设置画笔为无锯齿
pa.setAntiAlias(true);

步骤:
1:继承view(根据自己的需求总而继承不同的类)
2:四个构造方法+四个view方法(  1:OnMeasuer方法   测量自定义空间的大小
2:OnDraw 方法: 绘制显示的内容
3:OnLayout: 确定现实的位置
4:OnTouch:: 确定事件触摸事件)
3:需求绘制
4:自定义属性{
1:在values下,创建attrs文件
2:在XML里边引入配置的文件(引入空间)
3:调用配置的方法(取值+初始化(属性值)) ---->回收
4:在onDraw方法里边进行绘制
}


1:2D绘图基本要素 Canvas Paint Bitmap,BitmapFactory,BitmapRegionDecoder,ImageFormat,Movie,NinePatch 过度模式 Xfermode 主要子类 PoterDuffXfermode 过滤 RGB过滤 ColorFilter的三个子类 ColorMatrixFilter, PoterDuffColorFilter, LightingColorFilter alpha过滤 MaskFilter的两个实现类 BlurMaskFiler, EmbossMaskFilter DrawFilter的实现 PaintFlagsDrawFilter 变换 Matrix Camera ColorMAtrix 渐变 Shader的五个实现 BitmapShader, LinearGradient, SweepGradient, RadialGradient, ComposeShader 路径 Path PathEffect PathMeasure Rasterizer 区域 Region Drawable系列 BitmapDrawable,ShapeDrawable,LayerDrawable等等



2. 动态

假设你的自定View写好了,那么用户点击和滑动的时候会发生什么?如何处理点击事件和滑动事件?嵌套ScrollView会不会卡?喂猫点击某个View没反应?为什么在listView里面放button和imageView点击反应有区别?

这些问题归根结底,是View事件传递的问题;所以你得学习Android View的事件分发机制,相关教程网上非常之多,《艺术探索》和《群英传》都有讲,不赘述。

另外,可能有一些View还有动画,这就是另外一个话题了;酷炫的动画也是一个漂亮的App必不可少的内容,篇幅所限,略。

一、View结构原理
Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类。
View定义了绘图的基本操作
基本操作由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。具体操作如下:
1、measure操作
     measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:
     (1)onMeasure(),视图大小的将在这里最终确定,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。
 
2、layout操作
     layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作:
     (1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;
     (2)onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的;
 
3、draw操作
     draw操作利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。子类也不应该修改该方法,因为其内部定义了绘图的基本操作:
     (1)绘制背景;
     (2)如果要视图显示渐变框,这里会做一些准备工作;
     (3)绘制视图本身,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容“的,其包含了多个子view,而子View已经实现了自己的绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw()方法;
     (4)绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;
     (5)如果需要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),开始绘制渐变框;
     (6)绘制滚动条;
      从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。
二、View类的构造方法
创建自定义控件的3种主要实现方式:
1)继承已有的控件来实现自定义控件: 主要是当要实现的控件和已有的控件在很多方面比较类似, 通过对已有控件的扩展来满足要求。
2)通过继承一个布局文件实现自定义控件,一般来说做组合控件时可以通过这个方式来实现。
    注意此时不用onDraw方法,在构造广告中通过inflater加载自定义控件的布局文件,再addView(view),自定义控件的图形界面就加载进来了。
3)通过继承view类来实现自定义控件,使用GDI绘制出组件界面,一般无法通过上述两种方式来实现时用该方式。
 
三、自定义View增加属性的两种方法:
1)在View类中定义。通过构造函数中引入的AttributeSet 去查找XML布局的属性名称,然后找到它对应引用的资源ID去找值。
案例:实现一个带文字的图片(图片、文字是onDraw方法重绘实现)
四、控件绘制 onDraw()
 
无:自定义View的方法
onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
onMeasure() 检测View组件及其子组件的大小
onLayout() 当该组件需要分配其子组件的位置、大小时
onSizeChange() 当该组件的大小被改变时
onDraw() 当组件将要绘制它的内容时
onKeyDown 当按下某个键盘时
onKeyUp  当松开某个键盘时
onTrackballEvent 当发生轨迹球事件时
onTouchEvent 当发生触屏事件时
onWindowFocusChanged(boolean)  当该组件得到、失去焦点时
onAtrrachedToWindow() 当把该组件放入到某个窗口时
onDetachedFromWindow() 当把该组件从某个窗口上分离时触发的方法
onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发的方法

自定义View

标签:focus   容器类   图结构   tac   背景   布局   包装   事件传递   dimens   

原文地址:http://www.cnblogs.com/cainiaodongdong/p/7640687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!