美文网首页
Android 开发艺术探索笔记(十二) 之自定义 View

Android 开发艺术探索笔记(十二) 之自定义 View

作者: innovatorCL | 来源:发表于2018-03-20 22:49 被阅读15次

    当 Android 提供的普通控件不能满足我们 UI 设计的要求的时候,我们通常会使用自定义 View,下面介绍一下自定义 View 的知识。

    一、自定义 View 的分类

    • 1. 继承 View 重写 onDraw()

      这种方法主要用于实现一些不规则的效果,即这种效果不方便通过布局的组合方式达到,往往需要静态或者动态地显示一些不规则的图形。采用这种方法需要自己支持 wrap_content(即在这种模式下,onMeasure 需要给出制指定的宽高),并且 padding 也要自己处理。

    • 2. 继承 ViewGroup 派生特殊的 Layout

      这种方法主要用于实现自定义的布局,即实现除了 LinearLayout、RelativeLayout、FrameLayout 之外的效果,往往需要静态或者动态地显示一些不规则的图形。采用这种方法需要合适地处理 ViewGroup 的测量、布局这两个过程,并同时处理子元素的测量和布局过程。

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

      这种方法比较常见,用于拓展某种已有的 View 的功能,这种方法不需要自己支持 wrap_content 和 padding。

    • 4. 继承特定的 ViewGroup (如 LinearLayout)

      这种方法比较常见,当某种效果看起来很像几种 View 组合在一起的时候适用此方法。这种方法不需要自己处理 ViewGroup 的测量和布局这两个过程。

    二、自定义 View 的注意事项

    • 1. View 支持 wrap_content

      直接继承 View 和 ViewGroup 的控件,如果不在 onMeasure() 中对 wrap_content 做特殊处理,那么当外界在布局中使用 wrap_content 时,就会变成 AT_MOST , parentSize 的效果。

    • 2. 如果有必要,让 View 支持 padding

      直接继承 View 的控件,如果不在 draw() 中处理 padding,那么 padding 属性是无法时候生效的。另外,直接继承 ViewGroup 的控件需要在 onMeasure()onLayout() 中考虑 padding 和子元素的 margin 对其的影响,不然 padding 和 子元素的 margin 属性将会失效。

    • 3. 尽量不要在 View 中使用 Handler,因为 View 本身就提供了 post 系列方法,完全可以代替 Handler,除非你要用 Handler 发送消息

    • 4. View 中如果有线程或者动画,在变得不可见或者被移除后,需要及时停止线程和动画,不然有可能造成内存泄漏。

    • 5. View 嵌套滑动嵌套情形时,需要处理好滑动冲突。

    相关文章

      网友评论

          本文标题:Android 开发艺术探索笔记(十二) 之自定义 View

          本文链接:https://www.haomeiwen.com/subject/luclqftx.html