Android之shap、selector和layer-list

一、设置按钮或者文本框的样式:

本段借鉴于:https://blog.csdn.net/u012910985/article/details/21553591

shap的使用:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
     //共有4种类型,矩形(默认)/椭圆形/直线形/环形
    android:shape=["rectangle" | "oval" | "line" | "ring"]     
    // 以下4个属性只有当类型为环形时才有效
    android:innerRadius="dimension"     //内环半径
    //内环半径相对于环的宽度的比例,比如环的宽度为50,比例为2.5,那么内环半径为20
     android:innerRadiusRatio="float"    
    android:thickness="dimension"   //环的厚度
    android:thicknessRatio="float"     //环的厚度相对于环的宽度的比例
    //如果当做是LevelListDrawable使用时值为true,否则为false.
    android:useLevel="boolean">    

    <corners    //定义圆角
        android:radius="dimension"      //全部的圆角半径
        android:topLeftRadius="dimension"   //左上角的圆角半径
        android:topRightRadius="dimension"  //右上角的圆角半径
        android:bottomLeftRadius="dimension"    //左下角的圆角半径
        android:bottomRightRadius="dimension" />    //右下角的圆角半径

    <gradient   //定义渐变效果
        //共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变
        android:type=["linear" | "radial" | "sweep"]  
         //渐变角度,必须为45的倍数,0为从左到右,90为从上到下
        android:angle="integer"    
        android:centerX="float"     //渐变中心X的相当位置,范围为0~1
        android:centerY="float"     //渐变中心Y的相当位置,范围为0~1
        android:startColor="color"      //渐变开始点的颜色
        android:centerColor="color"     //渐变中间点的颜色,在开始与结束点之间
        android:endColor="color"    //渐变结束点的颜色
        android:gradientRadius="float"  //渐变的半径,只有当渐变类型为radial时才能使用
        android:useLevel=["true" | "false"] />  //使用LevelListDrawable时就要设置为true。设为false时才有渐变效果

    <padding    //内部边距
        android:left="dimension"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension" />

    <size   //自定义的图形大小
        android:width="dimension"
        android:height="dimension" />

    <solid  //内部填充颜色
        android:color="color" />

    <stroke     //描边
        android:width="dimension"   //描边的宽度
        android:color="color"   //描边的颜色
        // 以下两个属性设置虚线
        android:dashWidth="dimension"   //虚线的宽度,值为0时是实线
        android:dashGap="dimension" />      //虚线的间隔
</shape>

 在res/drawable下新建一个xml文件:shap_test.xml

布局调用如下:

<TextView
    android:layout_gravity="center_horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="提交订单"
    android:gravity="center"
    android:background="@drawable/shap_test"
    />

1.设置实线边框:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <stroke android:width="0.5dp" android:color="@color/black"/>
    <!--padding文本内容与边框的距离-->
    <padding
    android:left="30dp"
    android:top="10dp"
    android:right="30dp"
    android:bottom="10dp" />

</shape>

效果如下:

 2.设置虚线边框:

 在stroke里面,添加 android:dashWidth="5dp"和android:dashGap="5dp"属性就可以 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <!--dashWidth虚线的宽度,值为0时是实线,dashGap虚线的间隔-->
    <stroke
        android:width="0.5dp"
        android:color="@color/black"
        android:dashWidth="5dp"
        android:dashGap="5dp"
        />
    <!--padding文本内容与边框的距离-->
    <padding
    android:left="30dp"
    android:top="10dp"
    android:right="30dp"
    android:bottom="10dp" />

</shape>

 效果如下:

3.设置圆角矩形实线边框:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <stroke android:width="0.5dp" android:color="@color/black"/>
    <!--padding文本内容与边框的距离-->
    <padding
    android:left="30dp"
    android:top="10dp"
    android:right="30dp"
    android:bottom="10dp" />
    <!--corner定义圆角-->
    <!--radius全部的圆角半径,bottomLeftRadius为左上角的圆角半径,其他依次-->
     <corners
         android:radius="10dp"
         android:bottomLeftRadius="5dp"
         android:bottomRightRadius="5dp"
         android:topLeftRadius="5dp"
         android:topRightRadius="5dp"
         />
</shape>

效果如下: 

4.设置圆角矩形实线边框,并且添加背景颜色:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <stroke android:width="2dp" android:color="@color/ll_clicked"/>
    <!--padding文本内容与边框的距离-->
    <padding
        android:left="30dp"
        android:top="10dp"
        android:right="30dp"
        android:bottom="10dp" />
    <!--corner定义圆角-->
    <!--radius全部的圆角半径,bottomLeftRadius为左上角的圆角半径,其他依次-->
    <corners
        android:radius="10dp"
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp"
        />
    <!--solid内部填充颜色-->
    <solid android:color="@color/text_red"/>

</shape>

 效果如下:

你可以把设置stroke 边框的颜色和solid 的填充颜色设置一样, 或者去掉stroke 也可以

如下效果:

 

5.设置渐变颜色:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <stroke android:width="2dp" android:color="@color/white"/>
    <!--padding文本内容与边框的距离-->
    <padding
        android:left="30dp"
        android:top="10dp"
        android:right="30dp"
        android:bottom="10dp" />
    <!--corner定义圆角-->
    <!--radius全部的圆角半径,bottomLeftRadius为左上角的圆角半径,其他依次-->
    <corners
        android:radius="10dp"
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp"
        />
    <!--gradient定义渐变效果-->
    <!--type有三种渐变类型,linear线性渐变(默认),radial放射渐变,sweep扫描式渐变-->
    <!--startColor渐变开始颜色,centerColor渐变中间颜色,endColor渐变结束颜色,useLevel设为false时才有渐变效果-->
    <gradient
        android:type="linear"
        android:startColor="@color/ll_clicked"
        android:centerColor="@color/text_red"
        android:endColor="@color/black"
        android:useLevel="false"
        />

</shape>

效果如下: 

6.设置其他形状的,属性用法和其他一样

 设置椭圆:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    >
    <!--stroke描边,width为描边的宽度,color为边框的颜色-->
    <stroke android:width="0.5dp" android:color="@color/black"/>
    <!--padding文本内容与边框的距离-->
    <padding
    android:left="30dp"
    android:top="10dp"
    android:right="30dp"
    android:bottom="10dp" />

</shape>

 在shap里面添加 android:shape="oval"就行

效果如下;

其他的两种和这个差不多,就不写了

二,按钮点击的样式(状态选择器):

本段借鉴于: https://blog.csdn.net/qq_20451879/article/details/80340823

selector的使用:

以Xml方式写出状态选择器,然后将我们写好的selector状态器存在放res - drawable 或 res - color 文件夹下,较为常用

设置 bankgrpud的时候,我们的selector状态选择器存放在res - drawable 下!!!

设置TextColor属性的时候,我们的selector状态选择器存放在res - color 下!!!

设置drawble可以是颜色,也可以是图片,随需求而定!!!

状态设置类型:

常用类型:

//设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
android:state_pressed
//设置是否选中状态,true表示已选中,false表示未选中
android:state_selected
//设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checked
//设置勾选是否可用状态,类似state_enabled,只是state_enabled会影响触摸或点击事件,state_checkable影响勾选事件
android:state_checkable
//设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
android:state_focused
//设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
android:state_enabled

 不常用类型:

//设置当前窗口是否获得焦点状态,true表示获得焦点,false 表示未获得焦点,例如拉下通知栏或弹出对话框时, 当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
android:state_window_focused       
//设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的
android:state_activated             
//方法设置是否激活该控件
setActivated(boolean)
//设置是否鼠标在上面滑动的状态**,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
//补充:selector标签下有两个比较有用的属性要说一下,添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,
//但必须在API Level 11及以上才支持
android:state_hovered     
//状态改变时,旧状态消失时的淡出时间,以毫秒为单位
android:exitFadeDuration      
//状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:enterFadeDuration  

 样式一:改变按钮字体颜色:

前面说过------->设置TextColor属性的时候,我们的selector状态选择器存放在res - color 下!!!

然后在color里面新建btn_selector_textcolor1.xml

代码中引用为:

<Button
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="提交订单"
    android:gravity="center"
    android:textColor="@color/btn_selector_textcolor1"
    />

btn_selector.xml如下:

!!!注意:颜色的位置必须有顺序,按下的颜色在前

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item  android:color="@color/text_red_pressed" android:state_pressed="true"/>
    <item  android:color="@color/text_blue" />
</selector>

效果如下:

默认颜色是text_blue,然后按钮的颜色是text_red_pressed

 

 

样式二:点击改变按钮的背景颜色

设置 bankgrpud的时候,我们的selector状态选择器存放在res - drawable 下!!!

在drawble/res下新建btn_selector_bg1.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item  android:drawable="@color/text_red_pressed" android:state_pressed="true"/>
<item  android:drawable="@color/text_blue" />
</selector>

颜色设置再不是color了,是drawble

效果如下:

默认颜色是text_blue,然后按钮的颜色是text_red_presse

 

 

样式三:同时设置字体颜色和背景颜色:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="提交订单"
    android:textColor="@color/btn_selector_textcolor1"
    android:background="@drawable/btn_selector_bg1"
    />

 用的还是上面的selector。

效果如下:

 

样式四: android:state_checked (勾选状态)

给checkBox或者其他的控件有勾选的时候可以用:

<CheckBox
    android:layout_marginTop="20dp"
    android:background="@drawable/btn_selector_checked_bg2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Checked:点击后背景状态长存"
    android:gravity="center"
    />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item  android:drawable="@color/text_red_pressed" android:state_checked="true"/>
<item  android:drawable="@color/text_blue" />
</selector>

 设置android:state_checked="true"

效果如下:

 

其他的什么焦点state_focused="true"等等可以自己需要的时候去设置

三、layer-list的使用 

借鉴来自于:https://blog.csdn.net/weixin_40797204/article/details/78832640 

layer-list就像framelayout一样,一层被一层遮住

1.创建带有蓝色顶部边线的 layer-list 图

在res/drawble下新建一个btn_selector_bg3.xml,然后在background引用

<TextView
    android:layout_marginTop="20dp"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="@drawable/btn_selector_bg3"
    android:gravity="center"
    android:text="单一边线效果"/>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--底层使用蓝色填充色-->
    <item>
       <shape>
            <solid android:color="@color/text_blue"/>
         </shape>
    </item>
    <!--上面一层距离底层的顶部1dp,类似marginTop,填充色为白色,这样就形成了一个带有蓝色顶部边线的白色背景的图-->
    <item android:top="1dp">
        <shape>
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

 效果如下:

2.上下左右添加实线:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--底层使用蓝色填充色-->
    <item>
       <shape>
            <solid android:color="@color/text_blue"/>
         </shape>
    </item>
    <!--上面一层距离底层的顶部1dp,类似marginTop,填充色为白色,这样就形成了一个带有蓝色顶部边线的白色背景的图-->
    <item android:top="1dp" android:bottom="1dp" android:left="1dp" android:right="1dp">
        <shape>
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

其实就是添加了top,bottom,left,right

效果如下:

 

3.创建阴影效果:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="3dp" android:top="6dp">
       <shape>
            <solid android:color="#b4b5b6"/>
         </shape>
    </item>
    <item  android:bottom="6dp"  android:right="3dp">
        <shape>
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

 效果如下:

还有什么图片叠加和缩放的,可以去链接里面 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值