Android开发之Shape和Selector、Layer-list的详解
三者的使用的方法:
Java代码中:R.drawable.文件的名称
XML中:Android:background="@drawable/文件的名称"
1.Shape
[html] view plain copy - <?xmlversion="1.0"encoding="utf-8"?>
-
- <!--
- android:shape=["rectangle"|"oval"|"line"|"ring"]
- shape的形状,默认为矩形,可以设置为矩形(rectangle)、椭圆形(oval)、线性形状(line)、环形(ring)下面的属性只 android:shape="ring"时可用:
- android:innerRadius尺寸,内环的半径。
- android:innerRadiusRatio浮点型,以环的宽度比率来表示内环的半径,例如,如果android:innerRadiusRatio,表示 内环半径等于环的宽度除以5,这个值是可以被覆盖的,默认为9.
- android:thickness尺寸,环的厚度
- android:thicknessRatio浮点型,以环的宽度比率来表示环的厚度,例如,如果 android:thicknessRatio="2",那么环的厚度就等于环的宽度除以2。这个值是可以被android:thickness覆盖的,默认值是 3.
- android:useLevelboolean值,如果当做是LevelListDrawable使用时值为true,否则为false.
- -->
- <shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
-
- <!--
- 圆角
- android:radius整型半径
- android:topLeftRadius整型左上角半径
- android:topRightRadius整型右上角半径
- android:bottomLeftRadius整型右下角半径
- android:bottomRightRadius整型左下角半径
-
- 这里有个地方需要注意,bottomleftradius是右下角,而不是左下角,这个不要记错了。
还有网上看到有人说设置成0dp无效,不过我在测试中发现是可以的,我用的是2.2,可能修复了这个问题吧,如果无效的话那就只能设成1dp了。
- -->
- <corners
- android:radius="8dp"
- android:topLeftRadius="5dp"
- android:topRightRadius="15dp"
- android:bottomLeftRadius="20dp"
- android:bottomRightRadius="25dp"
- />
-
- <!--
- 渐变色
- android:startColor颜色值起始颜色
- android:endColor颜色值结束颜色
- android:centerColor整型 渐变中间颜色,即开始颜色与结束颜色之间的颜色
- android:angle整型 渐变角度
-
- 使用android:angle的注意事项:
- 当angle=0时,渐变色是从左向右。然后逆时针方向转,当angle=90时为从下往上。angle必须为45的整数倍
另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientradius="50"。
android:angle网 上有各种说法,这里,我说说自己的实验结果,渐变的时候,最原始的,即android:angle=“0”时,是从左到右,按照开始颜色到结束颜色来渲染 的,android:angle=“90”是从上到下来渲染的,android:angle=“180”是从右到左来渲染的,android:angle=“360”和android:angle=“0”是一样的,所以这里应该是这样的,渲染时按照最原始的渲染色板(把控件内部看作一块可以绕中心旋转的板子)围绕控件中心来旋转相应的度数,即android:angle里面的值就是所需要旋转的角度,只是这个旋转角度必须是45的整数倍)
- android:type["linear"|"radial"|"sweep"]渐变类型(取值:linear、radial、sweep)
- linear线性渐变,这是默认设置
- radial放射性渐变,以开始色为中心。
- sweep扫描线式的渐变。
-
- android:useLevel["true"|"false"] 如果要使用LevelListDrawable对象,就要设置为 true。设置为true无渐变。false有渐变色
-
- android:gradientRadius整型渐变色半径.当android:type="radial"时才使用。 单独使用android:type="radial"会报错。
- android:centerX整型渐变中心X点坐标的相对位置
- android:centerY整型渐变中心Y点坐标的相对位置
- -->
- <gradient
- android:startColor="#FFFF0000"
- android:endColor="#80FF00FF"
- android:angle="45"
- />
-
- <!--
- 内边距,即内容与边的距离
- android:left整型左内边距
- android:top整型上内边距
- android:right整型右内边距
- android:bottom整型下内边距
- -->
- <padding
- android:left="10dp"
- android:top="10dp"
- android:right="10dp"
- android:bottom="10dp"
- />
-
- <!--
- size大小
- android:width整型宽度
- android:height整型高度
- -->
- <size
- android:width="600dp"
- />
-
- <!--
- 内部填充
- android:color颜色值填充颜色
- -->
- <solid
- android:color="#ffff9d77"
- />
-
- <!--
- 描边
- android:width整型描边的宽度
- android:color颜色值描边的颜色
- android:dashWidth整型表示描边的样式是虚线的宽度,值为0时,表示为实线。值大于0则为虚线。
- android:dashGap整型表示描边为虚线时,虚线之间的间隔即“----”
- -->
- <stroke
- android:width="2dp"
- android:color="#dcdcdc"
- />
- </shape>
还有网上看到有人说设置成0dp无效,不过我在测试中发现是可以的,我用的是2.2,可能修复了这个问题吧,如果无效的话那就只能设成1dp了。
另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientradius="50"。
android:angle网 上有各种说法,这里,我说说自己的实验结果,渐变的时候,最原始的,即android:angle=“0”时,是从左到右,按照开始颜色到结束颜色来渲染 的,android:angle=“90”是从上到下来渲染的,android:angle=“180”是从右到左来渲染的,android:angle=“360”和android:angle=“0”是一样的,所以这里应该是这样的,渲染时按照最原始的渲染色板(把控件内部看作一块可以绕中心旋转的板子)围绕控件中心来旋转相应的度数,即android:angle里面的值就是所需要旋转的角度,只是这个旋转角度必须是45的整数倍)
2.Selector
根据不同的选定状态来定义不同的现实效果,分为四大属性:
android:state_selected是选中
android:state_focused是获得焦点
android:state_pressed是点击
android:state_enabled是设置是否响应事件,指所有事件
另:
android:state_window_focused默认时的背景图片
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:Android="http://schemas.android.com/apk/res/android">
- <!--默认时的背景图片-->
- <itemAndroid:drawable="@drawable/pic1"/>
- <!--没有焦点时的背景图片-->
- <item
- Android:state_window_focused="false"
- android:drawable="@drawable/pic_blue"
- /><!--获得焦点时的图片背景-->
<item
Android:state_focused="true"
Android:drawable="@drawable/pic_green"
/>- <!--非触摸模式下获得焦点并单击时的背景图片-->
- <item
- Android:state_focused="true"
- android:state_pressed="true"
- android:drawable="@drawable/pic_red"
- />
- <!--触摸模式下单击时的背景图片-->
- <item
- Android:state_focused="false"
- Android:state_pressed="true"
- Android:drawable="@drawable/pic_pink"
- />
- <!--选中时的图片背景-->
- <item
- Android:state_selected="true"
- android:drawable="@drawable/pic_orange"
- />
- <!--获得焦点时的图片背景-->
- <item
- Android:state_focused="true"
- Android:drawable="@drawable/pic_green"
- />
- </selector>
3.layer-list
3.1 多图层叠加效果(1)
四个角都是圆角的效果。如果让UI设计人员直接出图,可能会更简单一些。但是我们使用android中layer-list多图层叠加效果同样可以实现。
我们把它拆分为三个部分,第一个部分是最顶端的那一行(我这里称为顶部),第二部分是中间部分(中间部分不需要圆角效果),第三部分是底部。
顶部的实现:
顶部是一个有灰色边框但无下边框,带圆角,白色背景的长方体。实现效果如下:
<?xml version="1.0" encoding="UTF-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item > <shape> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomRightRadius="0.1dp" android:bottomLeftRadius="0.1dp" /> <stroke android:width="1dp" android:color="#ffa8abad" /> </shape> </item> <item android:top="1dp" android:left="1dp" android:right="1dp"> <shape> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomRightRadius="0.1dp" android:bottomLeftRadius="0.1dp" /> <stroke android:width="1dp" android:color="#ffffffff" /> </shape> </item> </layer-list>
中间部分是一个不带圆角 白色背景 灰色边框 无下边框 长方体.实现效果如下:
<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="#FFFFFF" /> <stroke android:width="1dp" android:color="#ffa8abad" /> </shape> </item> <item android:left="1dp" android:right="1dp" android:top="1dp"> <shape> <solid android:color="#FFFFFF" /> <stroke android:width="1dp" android:color="#ffffffff" /> </shape> </item> </layer-list>
底部是一个具有底部圆角,白色背景,灰色边框的长方体,实现效果如下:
<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="0.1dp" android:topRightRadius="0.1dp" android:bottomRightRadius="10dp" android:bottomLeftRadius="10dp" /> <stroke android:width="1dp" android:color="#ffa8abad" /> </shape> </item> <item android:top="1dp" android:bottom="1dp" android:left="1dp" android:right="1dp"> <shape> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="0.1dp" android:topRightRadius="0.1dp" android:bottomRightRadius="10dp" android:bottomLeftRadius="10dp" /> <stroke android:width="1dp" android:color="#ffffffff" /> </shape> </item></layer-list>
3.2 背景图片直接加阴影效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <? xml version = "1.0" encoding = "utf-8" ?> < layer-list xmlns:android = "http://schemas.android.com/apk/res/android" > <!-- 阴影部分 --> <!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 --> < item android:left = "2dp" android:top = "2dp" > < shape android:shape = "rectangle" > < gradient android:angle = "270" android:endColor = "#0F000000" android:startColor = "#0F000000" /> < corners android:bottomLeftRadius = "6dip" android:bottomRightRadius = "6dip" android:topLeftRadius = "6dip" android:topRightRadius = "6dip" /> </ shape > </ item > <!-- 背景部分 --> <!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) --> < item android:bottom = "3dp" android:right = "3dp" > < shape android:shape = "rectangle" > < gradient android:angle = "270" android:endColor = "#FFFFFF" android:startColor = "#FFFFFF" /> < corners android:bottomLeftRadius = "6dip" android:bottomRightRadius = "6dip" android:topLeftRadius = "6dip" android:topRightRadius = "6dip" /> </ shape > </ item > </ layer-list > |
- <layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <!--图片1-->
- <itemandroid:id="@+id/user_faceback_drawable"
- android:drawable="@drawable/faceback"/>
- <!--图片2-->
- <itemandroid:id="@+id/user_face_drawable"
- android:drawable="@drawable/h001"
- android:left="10.0dip"
- android:top="18.0dip"
- android:right="25.0dip"
- android:bottom="35.0dip"/>
- </layer-list>
- <!--2个图片的叠加-->
效果图如下:
更多相关文章
- android studio适配器Adapter
- android intent 传递list或者对象
- ListView 样式自定义
- android listview、GridView中item点击后改变其他item中的状态 s
- color 颜色代码 android res/values/colors.xml
- android SpannableString
- Android(安卓)中颜色对应的值
- 【Android-View】Android(安卓)View控相关低频属性
- Android——TextView指定字符串颜色高亮,实现类似微信、支付宝搜