自定义view的学习分为三部分
- 简书收藏的 《自定义view,这篇就够了》 这篇主要讲的是 自定单个view
- 整理 总结《android开发艺术探索》 上面的东西
- 看完项目中的各种自定义view,总结解决问题的思路和实用代码
自定义View基础知识
自定义的分类 (参考《Android开发艺术探索》)
- 继承特定的view
- 使用场景分析: 比如TextView(扩展功能或者使用字体等)
- 继承View类
- 使用场景分析:实现规则的效果,这种效果不方便通过布局的组合形式来达到,因此需要使用绘制的方式来实现,即重写OnDraw方法。但是比较复杂,需要自己支持wrap_content,并且padding也需要自己处理。
- 继承特定的ViewGroiup (比如LinearLayout)
- 使用场景分析:几种view组合在一起显示的时候,可以采用这种方式。只需要简单的处理。
- 继承ViewGroup派生特殊的Layout
- 使用场景分析:除了系统提供的Linear,RelativeLayout, FrameLayout之外,重新定义一种新的布局。几种view组合在一起显示的时候,可以采用这种方式。与上面方式的不同在于要更复杂一些,需要处理ViewGroup的测量和布局两个过程,同时也要处理子元素的测量和布局过程_
使用自定义属性
- 在很多情况下 使用自定义view都需要使用自定义属性。
- 在布局文件中像android:layout_width 之类的以android: 开头的属性都是系统自己带的属性。
使用自定义属性的步骤
-
第一步 在values目录下面创建自定义属性的XML,文件名称本身没有什么限制,可以随便取。如下所示:
- 这个属性的集合名称是 CycleView,用上面的标签来包裹。
- 上面定义了一个格式为“color”的属性“circle_color”, 格式除了颜色之外,还有其他格式,比如指定资源id的“reference”, 指定尺寸的dimension,指定基本数据类型的“string”,“integer”,“boolean”等。 TODO 整理自定义属性的format
-
第二步 在view的构造方法中解析自定义属性的值并且做相应的处理。如下图所示
- 首先加载自定义属性集合CircleView,然后根据CircleView属性集合加载circle_color属性。某个具体自定义属性都是有id的,比如这里id为 R.styleable.CircleView.circle_color, 所以属性的id是R.styleable. + “属性集合名称” + “具体的属性名字”。
-
第三步 在布局文件中使用自定义属性。如下图所示
- 自定义属性的前缀是 “app”,使用这个前缀的时候必须添加schemas声明:xmlns:app="http://schemas.android.com/apk/res-auto"。否则找不到自定义属性。
- 还有另外一种声明方式就是 xmlns:app="http://schemas.android.com/apk/res/ + "应用的包名",一般使用第一种方式来做。
-
完整的自定义属性 如下所示