一, 为什么要使用自定义View?
1, 当系统提供View 不能满足开发需要时, 则需要自定义View
2, 特定显示的风格
3, 处理一些特殊的用户交互
4, 优化布局
5, 代码的封装
二, 自定义View 的分类
1, 完全自定义View , 继承View , 重写相关的方法, 绘制控件
2, 继承已有的控件, 继承EditText, TextView, 在已有的控件上拓展新的功能
3, 组合定义的自定View, 继承ViewGroup或其子类对象, 目的是把多个小的组件组合成一个大的View
三, 使用的步骤
1, 定义一个类, 继承View ,重写构造方法
一个参数:
/**
*
在代码中, 定义View 时需要的方法
*
* TextView tv = new TextView(this);
*
* 必须要定义的构造方法, 目的是在java 代码中可以创建自定义View 的对象
*
* @param context 上下文对象
*/
public CustomView01(Context context) {
super(context);
}
两个参数:
/**
* 在布局页面中添加自定义View 的方法
*
* @param context 上下文对象
* @param attrs 自定义属性的集合
*
* 注意: 如果自定义的View 需要显示在布局页面中, 则必须重写该构造方法
*/
public CustomView01(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
三个参数
/**
* 在布局页面中使用
* @param context 上下文对象
* @param attrs 属性的集合
* @param defStyleAttr 默认自定义的样式风格
*/
public CustomView01(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
2, 重写父类的方法: 绘制的方法, 测量的方法
绘制的方法 onDraw(Canvas canvas)
绘制自定义View 中显示的内容
Canvas 画布 (文字, 线, 圆, 位置....)
Paint 画笔 (更改画笔的颜色, 更改绘制文字的大小...)
测量的方法 onMeasure()
MeasureSpac 反映View的宽度和高度的尺寸, 和传入的模式
AT_MOST 不固定的值, 根据内容来展示, 定义为wrap_content会得到这种模式
EXACTLY 精确的值, 当View的宽度或者高度被定义为精确的值或者match_parent都会得到这种模式
UNSPECIFIED 没有限制的, 不固定的, 通常用于复杂型控件, 如ListView , GridView,Spinner
四, 自定义属性
1, 步骤
1, 在res/values 中创建attrs.xml 的文件
2, 写入标签: <declare-styleable name="CustomView">
在该标签内部, 指定<attr 属性名称, format ="属性中属性值的类型"></attr>
2, format 属性值
reference 参考的id 引用类型 @.....
dimension 尺寸(包含单位 sp或者dp)
string 字符串
color 颜色
integer 整型
float 浮点型
enum 枚举
boolean 布尔
flag 位或者运算
fraction 百分比
实例:
实例一 : 自定义View 的简单介绍 构造方法 + 绘制方法 + 测量方法
实例二 : 自定义属性的使用 TypedArray : 把xml的属性内容转换为java 内容
实例三 : 自定义View的监听
转载请注明原文地址: https://www.6miu.com/read-2150205.html