自定义View 之设置自定义属性attr
在Values下面创建一个attr.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="BounceScrollView"><attr name="damping" format="float" /><attr name="scrollOrientation" format="enum"><enum name="vertical" value="0" /><enum name="horizontal" value="1" /></attr><attr name="incrementalDamping" format="boolean" /><attr name="bounceDelay" format="integer" /><attr name="triggerOverScrollThreshold" format="integer" /><attr name="disableBounce" format="boolean" /><attr name="nestedScrollingEnabled" format="boolean" /></declare-styleable><declare-styleable name="AutoPlayRecyclerView"><attr name="timeInterval" format="integer" /><attr name="direction" format="enum"><enum name="left" value="1" /><enum name="right" value="2" /></attr></declare-styleable></resources>
解释一下format对应的值:
"reference":某一资源id
"color":颜色值
"boolean":布尔值
"dimen":尺寸值
"float":浮点值
"integer":整型值
"string":字符串
"fraction":百分数
"enum":枚举值
"flag":位或运算
ViewGroup绘制流程
注意:View 及ViewGroup基本相同,只是在ViewGroup中不仅要绘制自己,还要绘制其中的子控件,而View 只要绘制自己就可以了
绘制流程分为三步:测量,布局,绘制,分别对应onMeasure(),onLayout(),onDraw()
onMeasure():测量当前控件的大小,为正式布局提供建议(只是建议,用不用还要看onLayout()函数)
主要是setMeasuredDimension(宽,高)设置
三个mode
Unspecified(未指定):父元素不对子元素施加任何束缚,子元素可以得到任意想要的大小
Exactly (完全):父元素 决定子元素的确切大小,子元素将被限定在给定的边界里而忽略他本身的大小
At_most(至多):子元素至多达到指定大小的值
模式提取:
int mode = MeasureSpec.getMode(widthMeasureSpec);if(mode == MeasureSpec.UNSPECIFIED){ }if(mode == MeasureSpec.EXACTLY){ }if(mode == MeasureSpec.AT_MOST){ }
获取 宽高
int measureWidth = MeasureSpec.getSize(widthMeasureSpec);int measureHeight = MeasureSpec.getSize(heightMeasureSpec);
onLayout(): 使用layout()函数对所有子控件进行布局
onDraw():根据布局的位置绘图