自定义View的分类以及须知

一、自定义View的分类
自定义View的分类标准不一,而我们可以先把自定义View 分为4类;

1.继承View重写onDraw方法

       这种方法主要用于实现一些不规则的效果,这种效果不方便通过布局的组合方式来达到,往往需要静态或者动态的显示一些不规则的图形,很显然这需要通过绘制的方法来实现,重写onDraw 方法,采用这种方式需要自己支持wrap_content,并且padding也是需要自己处理。

2.继承ViewGroup派生特殊的Layout

             这种方法主要用于实现自定义的布局,出了LinerarLayout、RelativeLayout、FrameLayout 这几种系统的布局之外,我们重新定义一种新布局、当某种效果看起来很像几种View组合在一起的时候,可以采用这种方法来实现,采用这种方式稍微复杂一些,需要合适的处理ViewGroup的测量、布局这两个过程,并同时处理子元素的测量和布局过程。

3.继承特定的View(比如TextView ImageVIew)

                这种方法比较常见,一般适用于扩展某种已有的View的功能,比图TextView,这种方法比较容易实现买这种方法不需要自己支持 wrap_content 和 padding等;

4.继承特定的VIewGroup(比如LinearLayout)

         这种方法比较常见,当某种效果看起来很像几个View组合在一起的时候,可以 采用这种方式来实现。采用这种方法不需要自己处理ViewGroup的测量和布局这两个过程,需要注意这种方法和第二种方法的区别,一半来说方法二种实现的效果方法四中也可以实现,两者的主要差别在于方法二更接近View的底层。

二、自定义View须知

  1. 让View支持wrap_content

            因为直接继承View或者ViewGroup的控件,如果不在onMeasure中对wrap_content中做一些的特殊处理,那么当外界在布局中使用wrap_content 时就无法达到预期的效果。
    
  2. 让View支持padding

                  如果不在draw方法中处理padding,那么padding属性是无法起作用的,另外,直接继承自ViewGroup 的控件需要在onMeasure 和onLayout中考虑padding和子元素的margin对其造成影响,不然将导致padding和子元素的margin失效。
    
  3. 尽量不要再View中使用Handler

        因为View内部本身就提供了post系列的方法,完全可以替代Handler的作用,当然除非自己很明确的要使用Handler来发送消息。
    
  4. View中如果有线程或者动画,需要及时停止

         如果有线程或者动画需要停止时候,那么onDetachedFromWindow是一个很好的时机,当包含View的Activity退出或者当前VIew被remove时,View的onDetachedFromWindow方法会被调用,和此方法对应的是onAttachedToWindow,当包含此View的Activity启动的时候,View的onAttachedToWindow方法会被调用,同时,当View变得不可见时我们也需要停止线程和动画,如果不及时处理这种问题,有可能会造成内存泄漏。
    
  5. View带有滑动嵌套情形时,需要处理好滑动冲突

                   如果有滑动冲突的时候,那么要合适的处理滑动冲突,否则将会严重影响View的效果,利用事件分发机制来进行解决方法。
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值