[Android View] 可绘制形状 (Shape Xml)

一切以官方文档为主

官方文档icon-default.png?t=N7T8https://developer.android.com/guide/topics/resources/drawable-resource?hl=zh-cn#Shape

什么是可绘制形状

可以理解为用xml文件来描述一个简单的Drawable图形,比如说以下这段xml就可以用来描述一个白色的圆形:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/white" />
</shape>

标准语法一览

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <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"] />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
</shape>

控制形状

其中 Shape 根标签下的 shape 属性决定了这个Drawable的形状 , 如图所示一共有四种可选值 ,分别是:

  • Rectangle 矩形

  • Oval 椭圆/圆形

  • Line 线

  • Ring 圆环

不同的形状下有不同的特定标签来决定其效果。

通用属性

除了特定的标签属性之外,还有一些通用的标签属性来决定一些通用的效果。

Size

最基础的属性,用来确定图形所处的矩形范围大小,具体就两个子属性:

<size>
    android:height尺寸。形状的高度,采用尺寸值或尺寸资源的形式。
    android:width尺寸。形状的宽度,采用尺寸值或尺寸资源的形式。

Padding

顾名思义,Padding属性是来确定图形填充的内边界的,具体如下:

<padding>
    android:left尺寸。左侧内边距,采用尺寸值或尺寸资源的形式。
    android:top尺寸。顶部内边距,采用尺寸值或尺寸资源的形式。
    android:right尺寸。右侧内边距,采用尺寸值或尺寸资源的形式。
    android:bottom尺寸。底部内边距,采用尺寸值或尺寸资源的形式。

Solid & Stroke

这两个属性放在一起说,前者是用来确定填充图形的颜色,后者用来确定描述图形轮廓线的属性,比如说同一个xml文件,若我们定义了Solid,其效果为下:

若我们定义了Stroke,效果则为:

可以看到,差别即为一个填充图形,一个对图形描边。

不过,我们也可以既对其描边又对其填充:

两个标签的描述详细如下:

<solid>
    android:color颜色。应用于形状的颜色,采用十六进制值或颜色资源的形式。
    
<stroke>
    android:width尺寸。线的宽度,采用尺寸值或尺寸资源的形式。
    android:color颜色。线的颜色,采用十六进制值或颜色资源的形式。
    android:dashGap尺寸。短划线的间距,采用尺寸值或尺寸资源的形式。仅在已设置 android:dashWidth 的情况下有效。
    android:dashWidth尺寸。每个短划线的长度,采用尺寸值或尺寸资源的形式。仅在已设置 android:dashGap 的情况下有效。    

至于stroke属性的dash,我们可以测试一下效果:

可以看到实际上就是一个虚线的效果。

Gradient

渐变标签,简而言之就是我们可以设置图形的填充颜色,其实这个就是相当于为图形的solid标签设置了一个渐变颜色,该如何理解呢?之前我们在Solid&Stroke标签中提到过,我们可以既对其描边,又对其填充,这里我们也同时设置stroke标签和gradient标签,效果如下:

具体标签如下:

<gradient>
    android:angle整数。渐变的角度(以度为单位)。0 为从左到右,90 为从下到上。该属性值必须是 45 的倍数。默认值为 0。android:centerX浮点数。渐变中心的相对 X 轴位置 (0 - 1.0)。
    android:centerY浮点数。渐变中心的相对 Y 轴位置 (0 - 1.0)。
    android:centerColor颜色。起始颜色与结束颜色之间的可选颜色,采用十六进制值或颜色资源的形式。
    android:endColor颜色。结束颜色,采用十六进制值或颜色资源的形式。
    android:gradientRadius浮点数。渐变的半径。仅当 android:type="radial" 时适用。
    android:startColor颜色。起始颜色,采用十六进制值或颜色资源的形式。
    android:type关键字。要应用的渐变图案的类型。
    android:useLevel布尔值。如果此属性用作 LevelListDrawable,该值为 true。

这个标签相比之前的标签来说复杂一点,我们来简要说明一下,以我的理解,如有错误还请指出。首先说明一下type属性,该属性决定了颜色渐变的方式:

这个类似于自定义View中的着色器的渐变模式,我们借用朱凯老师的自定义View中的效果图:

  • 线性渐变:

  • 径向渐变:

  • 扇形渐变:

其中startColor,endColor, centerColor,三个属性确定的是渐变起始位置,结束位置,和中间位置的颜色,这三个属性也是渐变中都有效的属性。

对于线性渐变来说,其特定的属性是angle,其确定的是颜色渐变的方向,这样说可能比较抽象。比如说默认情况下,angle属性为0,即渐变方向为0度角方向(X轴正向):

当我们设置angle属性为45度时,效果就如下:

总结一下,我们可以以图形左下角为坐标原点,以angle属性的角度方向引出一条射线(即极坐标系下),射线起点的颜色为startColor,延射出的方向向endColor渐变。

特有属性

Corners

该标签是专门为矩形,即shape为rectangle时设计的,它的效果也很简单,就是为矩形图形设置圆角,我们可以直观地感受一下,比如当我们设置了以下一段xml时:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners
        android:topLeftRadius="2dp"
        android:topRightRadius="4dp"
        android:bottomLeftRadius="6dp"
        android:bottomRightRadius="8dp"
        />
    <size
        android:width="50dp"
        android:height="50dp"
        />
    <gradient
        android:angle="45"
        android:startColor="@color/white"
        android:endColor="#FE2C55"
        android:gradientRadius="20dp"
        />
</shape>

最终呈现出来的效果如下:

可以看到四个圆角都按照我们的corners标签里设置的值来显示。

corners标签具体有五个可选的属性:

<corners>为形状创建圆角。仅当形状为矩形时适用。
    android:radius尺寸。所有角的半径,采用尺寸值或尺寸资源的形式。每个角的此属性都会被以下属性替换。
    android:topLeftRadius尺寸。左上角的半径,采用尺寸值或尺寸资源的形式。
    android:topRightRadius尺寸。右上角的半径,采用尺寸值或尺寸资源的形式。
    android:bottomLeftRadius尺寸。左下角的半径,采用尺寸值或尺寸资源的形式。
    android:bottomRightRadius尺寸。右下角的半径,采用尺寸值或尺寸资源的形式。

下边的四个属性我们都用过了,第一个属性是为所有的四个圆角设置统一的一个值,不过当下边的四个属性被设置的时候,会优先展示下边的四个属性,也就是说第一个属性会失效。

Ring下的标签

这个标签比较迷,首先来根据官网上的文档给出解释:

根据这个描述,理论上来说其效果应该是描述一个类似于圆环的东西,但是实际效果却是这样:

显示的是一个类似于菱形的东西,实机效果也是如此,所以说还是不建议用这种方法来展示环状,我们可以用stroke属性来实现环,比如:

其他属性

除了文档中介绍的几种属性之外,我们在shape根标签下还可以设置其他的几种属性:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:dither="true" //是否开启图像抖动
    android:tintMode="multiply" //着色模式
    android:tint="@color/white" //着色器
    android:visible="true" //是否可见
    android:opticalInsetLeft="@dimen/cardview_compat_inset_shadow" //光学插值 - 不太懂
    android:opticalInsetBottom="@dimen/cardview_compat_inset_shadow"
    android:opticalInsetRight="@dimen/cardview_compat_inset_shadow"
    android:opticalInsetTop="@dimen/cardview_compat_inset_shadow"
    >

这里简单介绍一下图像抖动:

指把图像从较高色彩深度(即可用的颜色数)向较低色彩深度的区域绘制时,在图像中有意地插入噪点,通过有规律地扰乱图像来让图像对于肉眼更加真实的做法。在实际的应用场景中,抖动更多的作用是在图像降低色彩深度绘制时,避免出现大片的色带与色块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/420892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

存储过程基本了解

文章目录 介绍存储过程示例1. 目的2. 输入参数3. 输出参数4. 执行逻辑5. 返回值6. 示例用法7. 注意事项 存储过程的关键字有哪些简单实操 介绍 存储过程是一组预编译的SQL语句&#xff0c;以及流程控制语句&#xff0c;封装在数据库服务器中并可以被重复调用。它们可以接收参数…

浅析扩散模型与图像生成【应用篇】(四)——Palette

4. Palette: Image-to-Image Diffusion Models 该文提出一种基于扩散模型的通用图像转换&#xff08;Image-to-Image Translation&#xff09;模型——Palette&#xff0c;可用于图像着色&#xff0c;图像修复&#xff0c;图像补全和JPEG图像恢复等多种转换任务。Palette是一种…

Harbor高可用(haproxy和keepalived)

Harbor高可用&#xff08;haproxy和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;haproxy和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设…

Linux Seccomp 简介

文章目录 一、简介二、架构三、Original/Strict Mode四、Seccomp-bpf五、seccomp系统调用六、Linux Capabilities and Seccomp6.1 Linux Capabilities6.2 Linux Seccomp 参考资料 一、简介 Seccomp&#xff08;secure computing&#xff09;是Linux内核中的一项计算机安全功能…

HTTPS是什么,详解它的加密过程

目录 1.前言 2.两种加密解密方式 2.1对称加密 2.2非对称加密 3.HTTPS的加密过程 3.1针对明文的对称加密 3.2针对密钥的非对称加密 3.3证书的作用 1.前言 我们知道HTTP协议是超文本传输协议,它被广泛的应用在客户端服务器上,用来传输文字,图片,视频,js,html等.但是这种传…

DataGrip的MySQL数据导出和导入操作指南

场景描述 将开发环境的数据&#xff0c;复制一份到本地&#xff0c;进行本地连接开发工作&#xff0c;避免组内其他开发人员的干扰。假若你的电脑上只安装了DataGrip和MySQL环境&#xff0c;本篇指南就是你所需要的。 一、导出dump数据 将开发环境的数据和结构导出一份到本地…

嵌入式中回调函数的实现方法

一、什么是回调函数 1.1、回调函数的定义和基本概念 回调函数是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&#xff0c;并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API。 基本概念&#xff1a; 回调&#xf…

WSL2部署RV1126 SDK编译环境

1 下载RV1126 SDK 在 Firefly | 让科技更简单&#xff0c;让生活更智能 下载REPO_SDK 这里将SDK下载到了F:\SDK 2 解压SDK到WSL2 tar -xvf /mnt/f/SDK/rv1126_rv1109_linux_release_20211022.tgz 3 编译依赖安装 gcc、g版本依赖安装 sudo apt-get install lib32gcc-7-dev g-7 l…

Data Leakage and Evaluation Issues inMicro-Expression Analysis 阅读笔记

IEEE Transactions on Affective Computing上的一篇文章&#xff0c;做微表情识别&#xff0c;阅读完做个笔记。本文讨论了Data Leakage对模型准确度评估的影响&#xff0c;及如何融合多个微表情数据集&#xff0c;从而提升模型的准确度。工作量非常饱满&#xff0c;很认真&…

C语言:编译与链接

C语言&#xff1a;编译 & 链接 环境翻译环境 编译预处理编译汇编 链接 环境 对C语言而言&#xff0c;生成程序的过程中存在两种环境&#xff1a;翻译环境与运行环境。 翻译环境 在翻译环境中&#xff0c;源代码会被转化为可执行的机器指令。这个过程会分为编译与链接两大…

java 商机管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商机管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

二叉搜索树的范围和(Lc938)——DFS

给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入&#xff1a;root [10,5,15,3,7,13,18,1,nul…

Stable Diffusion中的Clip模型

基础介绍 Stable Diffusion 是一个文本到图像的生成模型&#xff0c;它能够根据用户输入的文本提示&#xff08;prompt&#xff09;生成相应的图像。在这个模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型扮演了一个关键的角色&a…

C++ //练习 10.6 编写程序,使用fill_n将一个序列中的int值都设置为0。

C Primer&#xff08;第5版&#xff09; 练习 10.6 练习 10.6 编写程序&#xff0c;使用fill_n将一个序列中的int值都设置为0。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************************************…

红黑树的实现原理

要了解红黑树首先我们要知道什么是 平衡二叉树 平衡二叉树是一种特殊的二叉搜索树&#xff0c;它具有以下特点&#xff1a; 定义&#xff1a;平衡二叉树是一种二叉搜索树&#xff0c;其中每个节点的左右子树高度差的绝对值不超过 1&#xff0c;即任意节点的左右子树高度差不大于…

【前端素材】推荐优质在线电影院商城电商网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上浏览电影资源、租借或购买电影&#xff0c;以及观看在线影片。 2、功能需求 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上…

不管了,如何创建freestyle、pipeline项目我一定要安利给你!

Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 jenkins作为一个可扩展的自动化服务器&#xff0c;Jenkins可以用作简单的 CI…

AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境等应用

原文链接&#xff1a;AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境等应用 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的强大功能与应用场景 3)国内外经典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Di…

【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流 文章目录 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream检测流位置更改2.3 FileStream构造函数2.4 FileStream常用属性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…

[剪藏] - 尊湃通讯公司窃密曝光,发现绕不过华为

在科技领域风起云涌的今天&#xff0c;一场惊心动魄的窃密事件悄然发生&#xff0c;涉及华为WIFI6芯片技术的商业秘密被窃取&#xff0c;案中主谋竟然是一位曾在华为海思拥有重量级地位的技术大佬。本文将深入挖掘这起事件的来龙去脉&#xff0c;探讨窃密者的背叛和华为的技术守…
最新文章