day38 自定义view,自定义属性以及view绘制流程,touch事件分发
自定义view,自定义属性简介
- 什么是自定义view?
在系统原有控件基础上进行二次的修改以及添加。 - 哪里使用自定义view?
当系统原生控件无法满足用户需求时,基于系统原生控件进行二次修改如上下拉刷新等UI效果 - 如何使用自定义view
编写外部类继承自view
重写构造方法
在xml中引用 - 自定义属性?
res的values目录下的attrs.xml文件中(没有就自己新建一个),使用< declare-styleable>标签自定义属性
属性值的类型format
reference:参考某一资源ID 如background
color:颜色值
boolean:布尔值
dimension:尺寸值
float:浮点值
integer:整型值
string:字符串
fraction:百分数
enum:枚举值
< attr
name=“orientation”>
< enum
name=“horizontal” value=“0” />
< enum
name=“vertical” value=“1” />
< /attr>
flag:位或运算
< attr
name=“gravity”>
< flag
name=“top” value=“0x30” />
< flag
name=“bottom” value=“0x50” />
< flag
name=“left” value=“0x03” />
< flag
name=“right” value=“0x05” />
< flag
name=“center_vertical” value=“0x10” />
< /attr>
混合类型:属性定义时可以指定多种类型值
< attr name =
“background” format = “reference|color” />
TypedArray array =
context.obtainStyledAttributes(attrs,R.styleable.MainView);载入要读取的自定义属性
array.getString(R.styleable.MainView_str)获取属性
array.recycle()释放
https://blog.****.net/wdd1324/article/details/73176141
view绘制流程
View绘制流程?
onMeasure:测量自定义view的大小
onLayout:布局 自定义view中包含的子元素
onDraw:绘制
MeasureSpec,它是View的一个内部类,它表示对View的测量规格。MeasureSpec代表一个32位int值,高2位代表SpecMode(测量模式),低30位代表SpecSize(测量大小)
UNSPECIFIED 模式: 父View不对子View有任何限制,子View需要多大就多大
EXACTYLY 模式:父View已经测量出子Viwe所需要的精确大小,这时候View的最终大小就是SpecSize所指定的值。对应于match_parent和精确数值这两种模式
AT_MOST 模式: 子View的最终大小是父View指定的SpecSize值,并且子View的大小不能大于这个值,即对应wrap_content这种模式
touch事件分发
- 什么是touch事件?
一个Touch事件在用户点击屏幕(ACTION_DOWN)时产生,抬起手指(ACTION_UP)时结束,而Touch事件又被封装到MotionEvent当中。 - Touch事件传递?
dispatchTouchEvent:分发方法->接收父容器分发下来的touch事件
onInterceptTouchEvent:拦截方法->拦截tou事件
onTouchEvent:处理方法->处理touch事件