《Android开发艺术探索》 自定义View

##前言:

  1. 仅仅使用系统的控件是不够的,使用自定义View可以实现更棒的效果。
  2. 自定义View是一个综合的技术体系。设计View的层次结构,时间分发机制和View的工作原理等技术细节,所以自定义初学者当然会觉得自定义View比较难(认同!!!)。

所以将从一定的高度来理解自定义View,通过现象看本质,避免陷入只见树木不见森林的状态。

##1. 分类:

  1. 继承View从写onDraw()方法
    采用这种方式需要自己支持wrap_content,并且padding也需要自己处理。
  2. 继承ViewGroup派生特殊的Layout
    当效果看起来很像集中View组合在一起的时候,可以采用这种方法来实现。
  3. 继承特定的View
    一般用于扩展某种已有的View的功能。比如继承TextView进行增强等。
  4. 继承特定的ViewGroup
    比如继承LinearLayout进行增强等,或者继承RelativeLayout写组合控件。

##2. 自定义View注意事项:

  1. 让View支持wrap_content
    直接继承View或ViewGroup的控件,如果不支持wrap_content,则该控件的表现效果和match_parent一样。
  2. 如果有必要,支持padding
    直接继承View的控件,不在draw()方法中处理padding,则padding属性失效。继承ViewGroup的控件必须要在onMeasure()和onLayout()中考虑padding和margin,否则这两属性失效。
  3. 尽量不要在View中使用Handler
    View本身就提供了post系列方法,完全可以替代handler。除非很明确地要使用handler。
  4. View中如果有线程或动画,需要及时停止
    View.onDetachedFromWindow()中停止。如果不及时处理,会造成内存溢出。当包含此View的Activity退出或者此View被remove()时,就会调用该方法。
  5. View带有滑动嵌套情形时,需要处理好滑动冲突

##3. 获取View的宽高

  1. 在onWindowFocusChanged()中获取,但可能被频繁调用
  2. view.post(runnable)中获取,加入到消息队列尾部
  3. 使用ViewTreeObserver
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

baiiu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值