前言
根据启舰 的博客所学习的自定义View。
一、shape讲解
利用代码绘制出背景效果,可以定义填充色、描边、圆角、渐变等
1. 使用方法
在res/drawable文件夹下,新建一个文件,命名为xx.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="3dp" />
<padding
android:left="3dp"
android:right="3dp"
android:top="2dp"
android:bottom="2dp"/>
<stroke
android:width="1px"
android:color="@color/xhc_red" />
</shape>
调用的时候,一般这样:
android:background="@drawable/xx"
2. 具体讲解(corners、gradient、padding、size、solid、stroke)
- Corners
<corners //定义圆角
android:radius="dimension" //全部的圆角半径,与其它四个并不能共同使用
android:topLeftRadius="dimension" //左上角的圆角半径
android:topRightRadius="dimension" //右上角的圆角半径
android:bottomLeftRadius="dimension" //左下角的圆角半径
android:bottomRightRadius="dimension" /> //右下角的圆角半径
- solid和stroke
<solid //指定内部填充色
android:color="color" />
<stroke //描边属性
android:width="dimension" //描边的宽度
android:color="color" //描边的颜色
// 以下两个属性设置虚线
android:dashWidth="dimension" //虚线的宽度,值为0时是实线
android:dashGap="dimension" /> //虚线的间隔
- size和padding
<size //定义图形的大小
android:width="dimension"
android:height="dimension" />
<padding //定义内部边距
android:left="dimension"
android:top="dimension"
android:right="dimension"
android:bottom="dimension" />
举个栗子⤵️
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
android:topLeftRadius="20dp"
android:topRightRadius="2dp"/>
<solid
android:color="@color/colorPrimary"/>
//蓝色
<stroke
android:width="1dp"
android:color="@color/colorAccent"/>
//红色
<padding
android:bottom="3dp"
android:left="5dp"
android:right="5dp"
android:top="3dp"/>
<size
android:width="160dp"/>
</shape>
<TextView
android:layout_centerInParent="true"
android:textColor="#fff"
android:gravity="center"
android:text="shape demo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shapedemo"
/>
效果如下:
- gradient
<gradient
android:type=["linear" | "radial" | "sweep"] //共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变
android:angle="integer" //渐变角度,必须为45的倍数,0为从左到右,90为从上到下 ,只对线性渐变linear有效
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时才能使用
举个栗子⤵️
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
android:topLeftRadius="20dp"
android:topRightRadius="2dp"/>
<padding
android:bottom="3dp"
android:left="5dp"
android:right="5dp"
android:top="3dp"/>
<size
android:height="160dp"
android:width="160dp"/>
<gradient
android:type="sweep"
android:startColor="#ff0000"
android:centerColor="#00ff00"
android:endColor="#0000ff"
android:centerX="0.2"
android:centerY="0.8"/>
</shape>
效果图:
3. Shape的属性(rectangle、oval、line、ring)
android:shape=["rectangle" | "oval" | "line" | "ring"]
//shape的形状,默认为矩形,可以设置为矩形(rectangle)、椭圆形(oval)、线性形状(line)、环形(ring)
//下面的属性只有在android:shape="ring"时可用:
android:innerRadius // 尺寸,内环的半径。
android:innerRadiusRatio // 浮点型,以环的宽度比率来表示内环的半径,
android:thickness //尺寸,环的厚度
android:thicknessRatio // 浮点型,以环的宽度比率来表示环的厚度,例如,如果android:thicknessRatio="2", 那么环的厚度就等于环的宽度除以2。这个值是可以被android:thickness覆盖的,默认值是3.
android:useLevel // boolean值,如果当做是LevelListDrawable使用时值为true,否则为false. 一般设为false。
举个栗子:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadius="10dp"
android:thickness="50dp"
android:useLevel="false">
<!--(这里一定要要加上useLevel属性并定义为false,不然没有效果)-->
<solid android:color="#ff00ff"/>
<size
android:width="160dp"
android:height="110dp" />
</shape>
二、selector讲解
用于定义在用户不同的动作状态下,使用不同的背景值
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"] //如果这里设置成true就相当于居中,如果不设置或者设置为false就是拉伸
android:dither=["true" | "false"]//抖动效果
android:variablePadding=["true" | "false"] >//可变的填充,默认值为false,一般建议设置为false就行。
<item
android:drawable="@[package:]drawable/drawable_resource"// 设置图标或者drawable
android:state_pressed=["true" | "false"]//是否被按下
android:state_checked=["true" | "false"] //是否已勾选
android:state_checkable=["true" | "false"] //是否可勾选
android:state_selected=["true" | "false"] // 是否被选中
android:state_enabled=["true" | "false"] // 是否可用
android:state_focused=["true" | "false"] // 是否已获得焦点
android:state_active=["true" | "false"] //是否激活
android:state_window_focused=["true" | "false"] //窗口是否获得焦点
android:state_first=["true" | "false"] //是否处于开始状态
android:state_last=["true" | "false"] //是否处于结束状态
android:state_hovered=["true" | "false"] //光标是否停留在View的自身大小范围内的状态
</selector>
系统在selector寻找符合要求的item时是按照代码的顺序从上向下遍历的,一旦发现符合状态的item就直接使用它,并停止继续寻找!如果把这些状态理解成集合的话,那么位于下面的集合一定不要是上面某个集合的子集,否则是不会轮到下面这个集合出场的。
selector用法举例
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/picture1" />
<item
android:drawable="@drawable/picture2"/> //不能但在最上边哦,不然会失效的
</selector>
效果:
1.在按压状态下展示picture1这种图片;
2.在默认状态下展示picture2这种图片;
三、layerlist讲解
主要作用就是将多个图层按照顺序叠起来,做为一个背景图来显示。
1. layerlist用法举例
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@mipmap/bear"
/>
<!--left等四个偏移量和控件的margin设置差不多,都是外间距的效果。
如果不设置偏移量,前面的图层就完全挡住了后面的图层,从而也看不到后面的图层效果了。 -->
<item
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp">
<shape>
<corners android:radius="25dp"/>
<solid android:color="#00ff00"/>
</shape>
</item>
<item
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp">
<selector>
<item android:state_pressed="true"
>
<shape>
<corners android:radius="25dp"/>
<solid android:color="#FF0000"/>
</shape>
</item>
<item
>
<shape>
<corners android:radius="25dp"/>
<solid android:color="#FFFFFF"
/>
</shape>
</item>
</selector>
</item>
</layer-list>
<TextView
android:clickable="true"
android:layout_centerInParent="true"
android:textColor="#fff"
android:gravity="center"
android:text="shape demo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shapedemo"
/>
效果:
参考网址
Android中的Selector使用详解
Android开发中的drawable文件:shape、layer-list和selector标签