shape的优势,Android开发中,使用shape可以方便的帮我们画出背景,相对于png图片来说,使用shape可以减少安装包的大小,而且能够更好的适应不同的手机;

1.shape(GradientDrawable)

shape顾名思义就是形状的意思,我们在平时开发的中,应用的频率也很高,该文件是一个xml文件,并放在drawable文件夹下如res/drawable/filename.xml,那么引用方式也很简单,我们一般在控件的background使用,如android:background="@drawable/filename";

shape文件基本结构如下:

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape=""><corners /><gradient /><padding /><size /><solid /><stroke />
</shape>

1.1<shape>标签下常见属性

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"] >

属性说明

<!--   shape必须为根元素
xmlns:命名空间
android:shape指定形状类型
    rectangle:填充包含视图的矩形,当不写该属性时默认此形状
    oval:椭圆形状
    line:线形状,此形状需要 <stroke> 元素定义线宽
    ring:环形
当android:shape="ring"时,有可选属性
        android:innerRadius:尺寸。环内部(中间的孔)的半径
        android:innerRadiusRatio:浮点型。环内部的半径,以环宽度的比率表示。例如,如果 android:innerRadiusRatio="5",则内半径等于环宽度除以 5。此值被 android:innerRadius 覆盖。默认值为 9。
        android:thickness:环的厚度
        android:thicknessRatio:浮点型。环的厚度,表示为环宽度的比率。例如,如果 android:thicknessRatio="2",则厚度等于环宽度除以 2。此值被 android:innerRadius 覆盖。默认值为 3。
    需要注意的是,如果你使用了上面几个属性绘制一个圆,会发现在控件中并没有效果,我们还需要一个重要属性
        android:useLevel:布尔值。如果这用作 LevelListDrawable,则此值为“true”。这通常应为“false”,否则形状不会显示。
 -->
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"]  />

1.2<corners>标签下常见属性

<corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />

属性说明

<!--
       corners为形状产生圆角,仅当形状为矩形时使用
        android:radius:尺寸。所有角的半径,以尺寸值或尺寸资源表示。对于每个角,这会被以下属性覆盖。
        android:topLeftRadius:左上角的半径,以尺寸值或尺寸资源表示。
        android:topRightRadius:右上角的半径,以尺寸值或尺寸资源表示。
        android:bottomLeftRadius:左下角的半径,以尺寸值或尺寸资源表示。
        android:bottomRightRadius:右下角的半径,以尺寸值或尺寸资源表示
    -->

1.3<gradient>标签下属性说明

<gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />

属性说明

<!--
        指定形状的渐变颜色,使用渐变时不要使用solid,否则会被覆盖,看不到效果
        android:angle:整型。渐变的角度(度)。0 为从左到右,90 为从下到上。必须是 45 的倍数。默认值为 0,如果写该值不是45的整数倍,将没有效果。
        android:centerX:浮点型。渐变中心的相对 X 轴位置 (0 - 1.0)。
        android:centerY:浮点型。渐变中心的相对 Y 轴位置 (0 - 1.0)。
        android:centerColor:颜色。起始颜色与结束颜色之间的可选颜色,以十六进制值或颜色资源表示。
        android:endColor:颜色。结束颜色,表示为十六进制值或颜色资源。
        android:gradientRadius:浮点型。渐变的半径。仅在 android:type="radial" 时适用。且radial时必须有该属性,否则无效果
        android:startColor:颜色。起始颜色,表示为十六进制值或颜色资源。
        android:type:要应用的渐变图案的类型。有效值为
                      "linear"  线性渐变。这是默认值。
                      "radial"  径向渐变。起始颜色为中心颜色。
                      "sweep"   流线型渐变。
        android:useLevel:布尔值。如果这用作 LevelListDrawable,则此值为“true”。
    -->

1.4<padding>标签下属性说明

<padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" />

属性说明

<!--
        要应用到包含视图元素的内边距(这会填充视图内容的位置,而非形状)。
        android:left:尺寸。左内边距,表示为尺寸值或尺寸资源
        android:top:尺寸。上内边距,表示为尺寸值或尺寸资源
        android:right:尺寸。右内边距,表示为尺寸值或尺寸资源
        android:bottom:尺寸。下内边距,表示为尺寸值或尺寸资源
    -->

1.5<size>标签下属性说明

<size android:width="integer" android:height="integer" />

属性说明

<!-- 指定形状的大小 注:默认情况下,形状按照此处定义的尺寸按比例缩放至容器视图的大小。在 ImageView 中使用形状时,可通过将 android:scaleType 设置为 "center" 来限制缩放。 -->

1.6<solid>标签下属性说明

<solid android:color="color" />

属性说明

<!--- 用于填充形状的颜色 android:color:颜色。应用于形状的颜色 ->

1.7<stroke>标签下属性说明

<stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />

属性说明

<!--形状的笔划中线。即形状的边框android:width:尺寸。线宽,以尺寸值或尺寸资源表示。android:color:颜色。线的颜色,表示为十六进制值或颜色资源。android:dashGap:尺寸。短划线的间距,以尺寸值或尺寸资源表示。仅在设置了 android:dashWidth 时有效。android:dashWidth:尺寸。每个短划线的大小,以尺寸值或尺寸资源表示。仅在设置了 android:dashGap 时有效。
-->

在xml文件实现shape和用Java代码实现大同小异,他们命名规则都是相对应的,可以参考官方API文档,Drawable resources  |  Android Developers,shape标签对应的GradientDrawable类;

2.图层列表layer-list(LayerDrawable )

layer-list顾名思义就是分层的意思,我们在平时开发的中,应用的频率也很高,该文件是一个xml文件,并放在drawable文件夹下如res/drawable/filename.xml,那么引用方式也很简单,我们一般在控件的background使用,如android:background="@drawable/filename";

LayerDrawable 是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。每个可绘制对象由单一元素内的元素表示。我们需要注意的是layer-list中有item的先后顺序会影响展示效果,不同顺序的效果可能大相径庭,因为,后面的item总是在之前的item之上并覆盖显示

2.1layer-list文件结构

<layer-listxmlns:android="http://schemas.android.com/apk/res/android" ><item />
</layer-list>

2.1<layer-list>标签下属性说明

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

属性说明

<!-- 必备。这必须是根元素。包含一个或多个 <item> 元素。 xmlns:android:字符串。必备。定义 XML 命名空间,其必须是 "http://schemas.android.com/apk/res/android"。 -->

2.2<item>标签下属性说明

<item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />

属性说明

<!--
    定义要放在图层可绘制对象中由其属性定义的位置的可绘制对象。必须是 <selector> 元素的子项。接受子 <bitmap> 元素。
    android:drawable:可绘制对象资源。必备。引用可绘制对象资源。
    android:id:资源 ID。此可绘制对象的唯一资源 ID。要为此项新建资源 ID,请使用以下形式:"@+id/name"。加号表示应创建为新 ID。可以使用此 ID 检索和修改具有 View.findViewById() 或 Activity.findViewById() 的可绘制对象。
    android:top:整型。顶部偏移(像素)。
    android:right:整型。右边偏移(像素)。
    android:bottom:整型。底部偏移(像素)。
    android:left:整型。左边偏移(像素)。
    -->

在xml文件实现layer-list和用Java代码实现大同小异,他们命名规则都是相对应的,可以参考官方API文档,Drawable resources  |  Android Developers,layer-list标签对应的LayerDrawable类;

3.选择器selector

根据控件不同的状态显示不同的背景;

selector顾名思义就是选择器的意思,我们在平时开发的中,应用的频率也很高,该文件是一个xml文件,并放在drawable文件夹下如res/drawable/filename.xml,那么引用方式也很简单,我们一般在控件的background使用,如android:background="@drawable/filename";

3.1selector文件结构

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

3.1<selector>标签下属性说明

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

属性说明

<!-- 必备。这必须是根元素。包含一个或多个 <item> 元素。 xmlns:android:字符串。必备。定义 XML 命名空间,其必须是 "http://schemas.android.com/apk/res/android"。 -->

3.2<item>标签下属性说明

<itemandroid:drawable="@[package:]drawable/drawable_resource"android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_hovered=["true" | "false"]android:state_selected=["true" | "false"]android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"]android:state_enabled=["true" | "false"]android:state_activated=["true" | "false"]android:state_window_focused=["true" | "false"] />

属性说明

<!--

android:drawable:可绘制对象资源。必备。引用可绘制对象资源。
android:state_selected 是否选中 android:state_focused 是否获得焦点 android:state_pressed 是否按压
android:state_enabled 是否设置是否响应事件,指所有事件
...
 -->

在xml文件实现selector和用Java代码实现大同小异,他们命名规则都是相对应的,可以参考官方API文档,Drawable resources  |  Android Developers,selector标签对应的StateListDrawable类;

4.shape,layer-list,selector使用实践

<?xml version="1.0" encoding="utf-8"?>
<!--选择器-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><!--按下状态显示样式--><item android:state_pressed="true"><!--分层--><layer-list><!--分层 第一层--><item android:bottom="8dp"><shape><solid android:color="#ffaaaaaa" /></shape></item><!--分层 第二层--><item><shape><corners android:bottomLeftRadius="4dp"android:bottomRightRadius="4dp"android:topLeftRadius="1dp"android:topRightRadius="1dp" /><solid android:color="#ffaaaaaa" /><padding android:bottom="1dp"android:left="1dp"android:right="1dp"android:top="0dp" /></shape></item><!--分层 第三层--><item><shape><corners android:bottomLeftRadius="3dp"android:bottomRightRadius="3dp"android:topLeftRadius="1dp"android:topRightRadius="1dp" /><solid android:color="@android:color/holo_green_light" /></shape></item></layer-list></item><!--正常状态显示样式--><item><layer-list><item android:bottom="8dp"><shape><solid android:color="#ffaaaaaa" /></shape></item><item><shape><corners android:bottomLeftRadius="4dp"android:bottomRightRadius="4dp"android:topLeftRadius="1dp"android:topRightRadius="1dp" /><solid android:color="#ffaaaaaa" /><padding android:bottom="1dp"android:left="1dp"android:right="1dp" android:top="0dp" /></shape></item><item><shape><corners android:bottomLeftRadius="3dp"android:bottomRightRadius="3dp"android:topLeftRadius="1dp" android:topRightRadius="1dp" /><solid android:color="@android:color/holo_blue_light" /></shape></item></layer-list></item>
</selector>

4.1shape使用示例

矩形实线边框-内填充(rect_solid_border.xml)

<!--矩形实线边框-内填充-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><stroke android:color="@android:color/holo_red_dark"android:width="2dp"/><solid android:color="@android:color/holo_blue_light" />
</shape>

 矩形虚线边框-内填充(rect_dashed_border.xml)

<?xml version="1.0" encoding="utf-8"?>
<!--矩形虚线边框-内填充-->
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><stroke android:color="@android:color/holo_red_light"android:width="2dp"android:dashGap="5dp"android:dashWidth="10dp"/><solid android:color="@android:color/holo_green_light"/>
</shape>

圆角矩形-有边框有填充(rect_rounded_border_and_fill.xml)

<!--圆角矩形-有边框有填充-->
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><stroke android:width="2dp" android:color="@android:color/holo_red_light" /><solid android:color="@color/purple_200" /><corners android:topLeftRadius="15dp"android:topRightRadius="15dp"android:bottomLeftRadius="15dp"android:bottomRightRadius="15dp" />
</shape>

矩形圆角+左右两边为一个圆弧(rect_rounded_top_bottom_arc.xml)

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圆角+左右两边为一个圆弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"><size android:width="20dp"android:height="60dp" /><solid android:color="#8000ff00" /><!-- 圆角半径是高度的一般就是一个圆弧了 --><corners android:radius="20dp" />
</shape>

​​​​​​矩形内部填充-扫描渐变(rect_gradient_sweep.xml)

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形内部填充-扫描渐变 -->
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"android:useLevel="true"><!--如果布局中没有设置View的大小,会size设置的大小为默认值--><sizeandroid:width="20dp"android:height="20dp" /><strokeandroid:width="1px"android:color="#ffff00ff" /><!--调整angle不能实现角度变化centerX,centerY是中心点的位置,这里用的是百分比值(0-1)在rect中gradientRadius无效--><gradientandroid:angle="0"android:centerX="0.5"android:centerY="0.5"android:startColor="#ff00ff00"android:gradientRadius="20dp"android:type="sweep" />
</shape>

圆环-仅有边框(ring_border.xml)

<?xml version="1.0" encoding="utf-8"?>
<!-- 圆环-仅有边框 -->
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="ring"android:innerRadius="20dp"android:thickness="16dp"android:useLevel="false"><!--android:useLevel="false"必须是false--><sizeandroid:width="80dp"android:height="80dp" /><strokeandroid:width="3dp"android:color="#ffff00ff" />
</shape>

5.总结

  • 控件把<shape>标签做为背景对应是GradientDrawable类,不是ShapeDrawable;
  • GradientDrawable可以通过Java代码实现和<shape>标签一样的定义;
  • DrawableInflater负责解析相应的shape,scale等相关xml文件配置,解析成相应的类;

参考:

Drawable resources  |  Android Developers

Android XML shape 标签使用详解(apk瘦身,减少内存好帮手) - popfisher - 博客园

Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现) - popfisher - 博客园

Android开发:shape和selector和layer-list的(详细说明)_陈三哥的博客-CSDN博客_android layer-list​​​​​

安卓中常用的shape,selector,layer-list - 可乐鸭头 - 博客园

Android View — Gradient 渐变 - 简书

Android的ShapeDrawable和GradientDrawable源码解析 - 菜鸟学院

Android可绘制对象资源之shape和layer-list使用_Code4Android-CSDN博客

Android常用的shape,selector,layer-list使用说明相关推荐

  1. android level list,Android Drawable (levle List selector layer List)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量.使用 setLevel() 设置可绘制对象的级 ...

  2. Android开发:shape和selector和layer-list的(详细说明)

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...

  3. android自定义样式大全:shape,selector,layer-list,style,动画全部内容

    原文:http://keeganlee.me/post/android/20150830 以下摘取了部分内容: shape 一般用shape定义的xml文件存放在drawable目录下,若项目没有该目 ...

  4. android 常用框架整理

    文章目录 UI 框架 WebView 框架 具体内容 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其他 动画 网络相关 网络连接 网络测试 图像获取 响应式编程 地图 ...

  5. 学习笔记之——Android常用属性归纳

    本篇博客仅作为个人学习笔记所用,各种Android常用属性归纳长期更新,如有错误和建议还望指点~ 1.控件透明度和半透明度: 半透明<Button Android:background=&quo ...

  6. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  7. android设置背景颜色渐变,Android背景渐变色(shape,gradient)

    Android设置背景色可以通过在res/drawable里定义一个xml,如下: android:startColor="#FFF" android:endColor=" ...

  8. Android美工坊:Selector选择器的使用

    Android selector选择器可以让你切换自定义的背景风格,比如button.ListView.或者布局点击时候的背景切换等,都需要用到它 背景可以是自定义到颜色,或者图片资源 首先需要在你的 ...

  9. Android样式开发---shape

    Thanks to:转载自Keegan小钢 原文链接:http://keeganlee.me/post/android/20150830 一个应用,应该保持一套统一的样式,包括Button.EditT ...

最新文章

  1. 【原创】浅说windows下的中断请求级IRQL
  2. C# 浅拷贝与深拷贝区别 解惑篇
  3. vim切换编程语言_把 Vim 打造成源代码编辑器 - C 语言编程透视
  4. Notice: Undefined variable解决办法
  5. 写好的python如何在其它电脑上运行_如何在另一个文件中运行一个python文件?
  6. 单调队列优化和决策单调性优化
  7. c语言多重括号,大佬在吗,我用C写了一个去多重括号的函数,结果。。。
  8. 嵌入式开发之davinci--- MSB和LSB
  9. Spring Boot2.0之 原理—创建内置Tomcat容器
  10. 【英语学习】【医学】无机化学 - 化合物命名(1) - 离子化合物
  11. python数组中一列拆分,根据Python中的数组值拆分数组
  12. React中useEffect使用
  13. PowerDesigner概念模型与物理模型相互转换及导出数据字典
  14. 团购的野心,占领网购市场半壁江山?
  15. 02333软件工程_202010_试卷+答案
  16. uniapp基础开发模板
  17. win7无法连接打印机拒绝访问_win7系统共享打印机拒绝访问的完美解决方法
  18. 联想s40-70进入bios方法。
  19. 1688关键词搜索api(附可用)
  20. H60-RS232自动售货机主板规格书

热门文章

  1. Vite(四)后端集成、比较Snowpack、从 v1 迁移、Awesome Vite.js
  2. [luogu2469] 星际竞速
  3. 小程序获取昵称和头像
  4. bug:have 2 and 1 different commits each, respectively.
  5. 电机EMC之降噪“三叉戟”
  6. 常用的密码算法有哪些?
  7. c语言空中升级协议,BLE的空中升级(OTA)
  8. 基于异常行为的未知勒索软件检测
  9. 计算序列 1 + 2 + 3 + ... 的前N项之和。
  10. 领域驱动设计(英语:Domain-driven design,缩写 DDD)