shape 和selector的使用

96
tome869535144
2018.10.22 15:39 字数 823

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

日记本
Gupao