XML Drawable 与9-Patches

2024-04-28 11:08
文章标签 xml drawable patches

本文主要是介绍XML Drawable 与9-Patches,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android把任何可绘制在屏幕上的图形图像都称为drawable。drawable可以是一种抽象的图形、一个继承Drawable类的子类,或者是一张位图图像。接下来,我们将会接触到更多的drawable:state list drawable、shap drawable、layer list drawable以及nine patch drawable。前三个drawable通常定义在XML布局文件中,因此我们同一将他们归属为XMLdrawable类别。

一、Shap Drawable

原图如下:
这里写图片描述

设置按钮的背景

<style name="RemoteButton"><item name="android:layout_width">0dp</item><item name="android:layout_height">match_parent</item><item name="android:textColor">#556699</item><item name="android:textSize">20dp</item><item name="android:layout_margin">3dp</item><item name="android:background">#ccd7ee</item></style>

效果图如下:

这里写图片描述

在style中添加了android:background属性后,按钮的三维视觉效果消失了。点击任何一个按钮,会发现按钮的状态切换也不起作用了。

只改变一个属性,为什么会带来如此大的变化?这是因为,和View类不同,Button类没有被赋予默认样式。默认样式来自于所选主题,并会设置一个Drawable作为视图的背景。正是这种背景Drawable负责着视图的三维显示效果以及状态的切换。

在res/drawable目录下,以shape为根元素创建一个名为button_shape_normal.xml的文件。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle" ><corners android:radius="5dp" /><gradient
        android:angle="90"android:endColor="#cccccc"android:startColor="#acacac" /></shape>

该XML文件定义了一个圆角矩形。corners元素指定了圆角矩形的圆角半径,而gradient元素则指定了色彩渐变的方向以及起始颜色。

更新按钮的样式

<style name="RemoteButton"><item name="android:layout_width">0dp</item><item name="android:layout_height">match_parent</item><item name="android:textColor">#556699</item><item name="android:textSize">20dp</item><item name="android:layout_margin">3dp</item><item name="android:background">@drawable/button_shape_normal</item></style>

效果图如下
这里写图片描述

二、state list drawable

使用state list drawable,可根据关联View的不同状态显示不同的drawable。

在res/drawable目录下,以selector为根元素创建一个名为button_shape.xml的文件。

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

更新按钮的样式

    <style name="RemoteButton"><item name="android:layout_width">0dp</item><item name="android:layout_height">match_parent</item><item name="android:textColor">@drawable/button_text_color</item><item name="android:textSize">20dp</item><item name="android:layout_margin">3dp</item><item name="android:background">@drawable/button_shape</item></style>

效果图如下
这里写图片描述

三、layer list drawable与 inset drawable

原图时按钮具有阴影显示效果,但不幸得是,shape drawable没有可用的阴影属性。但使用其它两种类型的XML drawable,可自创阴影效果。这两种XML drawable 类型分别是:layer list drawable与 inset drawable。

在res/drawable目录下,以layer-list为根元素创建一个名为button_shape_shadowed.xml的文件。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" ><item><shape android:shape="rectangle" ><corners android:radius="5dp" /><gradient
                android:angle="90"android:centerColor="#303339"android:centerY="0.05"android:endColor="#000000"android:startColor="#00000000" /></shape></item><item><inset
            android:drawable="@drawable/button_shape"android:insetBottom="5dp" /></item></layer-list>

首先,使用与当前按钮drawable同样的shape创建一个阴影。然后,使用layer-list将阴影shape与当前按钮组合起来,在使用insert对按钮底边进行适当的短距移位,直到能够看到阴影显示。

可以看到,layer-list元素包含了多个drawable,并以从后至前的绘制顺序进行排序。列表中第二个drawable是一个insert drawable,其任务就是在已创建的drawable底部做5dp单位的移位,并刚好落在移位形成的阴影上。

注意,阴影drawable并未使用单独的文件,而是直接被嵌入了layer-list中。该技巧同样适用于其它drawable,如前面的state list drawable。

更新按钮的样式

<style name="RemoteButton"><item name="android:layout_width">0dp</item><item name="android:layout_height">match_parent</item><item name="android:textColor">@drawable/button_text_color</item><item name="android:textSize">20dp</item><item name="android:layout_margin">3dp</item><item name="android:background">@drawable/button_shape_shadowed</item></style>

效果图如下
这里写图片描述

四、9-patch drawable

为什么叫做9-patch?9-patch可将图像分成3x3的网格,即由9部分或9 patch组成的网格。网格角落的patch不会被缩放,边缘部分的4个patch只按一个维度缩放,而中间部分则同时按两个维度缩放。

这里写图片描述

9-patch图像和普通图像基本相同,但以下两点除外:9-patch图像文件名是以.9,png结尾,图像边缘具有一个像素宽度的边框,用以指定9-patch图像的中间位置。边框像素绘制为黑线,以表明中间位置,边缘部分则用透明色表示。

顶部以及左边边框标记了图像的可伸缩区域。底部以及右边框定义了用于9-patch图像的可选drawable区域。drawable区域是内容(通常是文字)绘制的地方。

这里写图片描述

代码地址

这篇关于XML Drawable 与9-Patches的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943094

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

SpringBoot中配置文件pom.xml的使用详解

《SpringBoot中配置文件pom.xml的使用详解》SpringBoot的pom.xml文件是Maven项目的核心配置文件,用于定义项目的依赖、插件、构建配置等信息,下面小编就来和大家详细介绍一... 目录1. 基本结构2. 关键部分详解2.1 <modelVersion>2.2 项目坐标2.3 <p

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

intellij idea generatorConfig.xml

generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-ge