shape 和selector的使用
shape 属性
shape的形状,默认为矩形,可以设置为矩形(rectangle)、椭圆形(oval)、线性形状(line)、环形(ring)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/y20" />
<solid android:color="@color/white" />
<stroke
android:width="2px"
android:color="@color/colorLine" />
</shape>
image.png
默认为rectangle,需要注意line和ring需要通过标签来指定线的宽度和颜色等信息,否则无法达到预期效果
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
size -- 矩形大小,在最终显示尺寸是没有用的,shape是会被拉伸或者缩小为view的大
<size
android:width="200dp"
android:height="20dp"
/>
solid—-定义形状的背景填充色
<solid android:color="#d22121"/>
corners—-设置形状四个角的圆角大小
<corners android:radius="50dp"/>
gradient—-设置形状背景色的渐变(一共有九个属性)
<gradient
android:angle="integer" 渐变的角度,默认为0,其值必须是45的倍数,0表示从左到右,90表示从下到上
android:centerX="integer" 渐变的中心点横坐标
android:centerY="integer" 渐变的中心点纵坐标
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer" 渐变半径,仅当android:type=”radial”时有效
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
-----------------------------------
<gradient
android:startColor="#fff"
android:centerColor="#f1a9a9"
android:endColor="#ec5b5b"
android:type="linear"
/>
stroke—-给形状设置描边
<stroke
android:dashWidth="4dp"
android:dashGap="2dp"
android:width="1px"
android:color="#ffff1c77"
/>
android:dashWidth表示虚线的宽度
android:dashGap表示虚线之间的间隔
以上两个属性如果不设置则为实线
padding—-设置以此形状为背景的内容距形状四周的内边距。
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
selecctor 属性
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/alert_btn_right_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/trans_bg"/>
</selector>
android:state_enabled: 设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
android:state_pressed: 设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
android:state_selected: 设置是否选中状态,true表示已选中,false表示未选中
android:state_checked: 设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checkable: 设置勾选是否可用状态,类似state_enabled,只是state_enabled会影响触摸或点击事件,而state_checkable影响勾选事件
android:state_focused: 设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
android:state_window_focused: 设置当前窗口是否获得焦点状态,true表示获得焦点,false表示未获得焦点,例如拉下通知栏或弹出对话框时,当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
android:state_activated: 设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件
android:state_hovered: 设置是否鼠标在上面滑动的状态,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
注意点:
item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,而不是采用最佳匹配的规则;所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了。
另外,selector标签下有两个比较有用的属性要说一下,添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,但必须在API Level 11及以上才支持:
android:enterFadeDuration 状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:exitFadeDuration 状态改变时,旧状态消失时的淡出时间,以毫秒为单位
参考:
https://www.jianshu.com/p/c3652a8c37ac
https://www.jianshu.com/p/209e6be5d7e9