[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"?>
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape=["rectangle" | "oval" | "line" | "ring"] ><cornersandroid:radius="integer"android:topLeftRadius="integer"android:topRightRadius="integer"android:bottomLeftRadius="integer"android:bottomRightRadius="integer" /><gradientandroid: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"] /><paddingandroid:left="integer"android:top="integer"android:right="integer"android:bottom="integer" /><sizeandroid:width="integer"android:height="integer" /><solidandroid:color="color" /><strokeandroid: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"><cornersandroid:topLeftRadius="2dp"android:topRightRadius="4dp"android:bottomLeftRadius="6dp"android:bottomRightRadius="8dp"/><sizeandroid:width="50dp"android:height="50dp"/><gradientandroid: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.pswp.cn/news/711105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos中安裝Docker及Docker的使用

在centos7系統中安裝指定版本的docker,并通過docker使用安裝mysql為例,闡述docker的使用。 2.1、Docker卸載及安裝yum依賴 【卸載Docker,如果安裝的Docker的版本不合適】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

智能汽車軟硬件產品CES展示汽車技術新亮點

智能汽車是汽車產業發展的新趨勢&#xff0c;是未來汽車發展的必然方向。智能汽車是指搭載了先進的傳感器、控制器、執行器等部件&#xff0c;并融合了人工智能、自動駕駛等技術&#xff0c;能夠實現部分或完全自動駕駛、智能網聯等功能的汽車。 近年來&#xff0c;智能汽車技…

抖店怎么開店注冊?新手需要準備什么?這幾個步驟很關鍵!

我是電商珠珠 不少人瞄準了抖店這個短視頻電商勢頭&#xff0c;想要在今年大干一場。關于抖店注冊這方面&#xff0c;部分人還不太清楚&#xff0c;今天我就帶大家一步步注冊&#xff0c;看一遍就會了。 前期準備資料 前期新手的話&#xff0c;需要準備一張個體工營業執照&a…

Java實戰:Web實時消息推送技術

一、引言 隨著互聯網技術的飛速發展和用戶對實時交互體驗的追求&#xff0c;Web實時消息推送已成為眾多在線平臺的核心功能之一。無論是社交網絡的新消息通知、協同辦公工具的實時更新&#xff0c;還是電商平臺的訂單狀態變更&#xff0c;都需要實時、準確地將信息推送到用戶的…

【Java設計模式】二、單例模式

文章目錄 0、單例模式1、餓漢式2、懶漢式3、雙重檢查4、靜態內部類5、枚舉6、單例模式的破壞&#xff1a;序列化和反序列化7、單例模式的破壞&#xff1a;反射8、單例模式的實際應用 設計模式即總結出來的一些最佳實現。GoF(四人組) 書中提到23種設計模式&#xff0c;可分為三大…

B站畫質補完計劃(2):視頻超分讓像素細膩生動

本期作者 1 前言 為了給用戶提供更清晰的畫質體驗&#xff0c;B站自研的超分辨率算法已經在站內廣泛應用&#xff0c;支持了如《賽馬娘》、《流浪地球2》、《權力的游戲》、英雄聯盟S賽賽事直播等知名番劇、電影電視劇以及重要游戲賽事直播的 4K 視頻流生產。 2 超分算法的應用…

論文閱讀:2020GhostNet華為輕量化網絡

創新&#xff1a;&#xff08;1&#xff09;對卷積進行改進&#xff08;2&#xff09;加殘差連接 1、Ghost Module 1、利用1x1卷積獲得輸入特征的必要特征濃縮。利用1x1卷積對我們輸入進來的特征圖進行跨通道的特征提取&#xff0c;進行通道的壓縮&#xff0c;獲得一個特征濃…

“智農”-高標準農田

高標準農田是指通過土地整治、土壤改良、水利設施、農電配套、機械化作業等措施&#xff0c;提升農田質量和生產能力&#xff0c;達到田塊平整、集中連片、設施完善、節水高效、宜機作業、土壤肥沃、生態友好、抗災能力強、與現代農業生產和經營方式相適應的旱澇保收、穩產高產…

C++設計模式之——享元模式詳解和代碼案例

文章目錄 C中實現享元模式通常涉及以下幾個關鍵部分&#xff1a;一個簡單的C代碼片段示例享元模式的進一步說明C享元模式代碼案例——咖啡店訂單系統享元模式在現實世界的應用場景 C中實現享元模式通常涉及以下幾個關鍵部分&#xff1a; 享元模式&#xff08;Flyweight Patter…

LCR 153. 二叉樹中和為目標值的路徑

解題思路&#xff1a; 回溯&#xff1a;先序遍歷&#xff0b;路徑記錄 class Solution {LinkedList<List<Integer>> res new LinkedList<>();LinkedList<Integer> path new LinkedList<>();public List<List<Integer>> pathTarge…

android 如何動態修改swap

前言 當前項目中發現&#xff0c;產品在長時間使用后&#xff0c;會概率死機&#xff0c;通過log分析&#xff0c;可能和swap 大小太小導致的&#xff0c;需要修改增大swap大小后&#xff0c;壓測驗證。如何查看swap大小 cat /proc/swaps C:\Users\Administrator>adb shel…

元學習(meta-learning)的通俗解釋

目錄 1、什么是元學習 2、元學習還可以做什么 3、元學習是如何訓練的 1、什么是元學習 meta-learning 的一個很經典的英文解釋是 learn to learn&#xff0c;即學會學習。元學習是一個很寬泛的概念&#xff0c;可以有很多實現的方式&#xff0c;下面以目標檢測的例子來解釋…

阿里Replace Anything:一鍵替換萬物,讓圖像編輯更簡單

最近&#xff0c;阿里巴巴智能研究院在AIGC領域可謂動作頻頻&#xff0c;新品發布不斷&#xff0c;在之前的文章已經向大家介紹了關于Animate AnyOne, Outfit Anyone&#xff0c;AnyText, AnyDoor等相關技術&#xff0c;感興趣的小伙伴可以點擊下面鏈接閱讀&#xff5e; AI一鍵…

Laravel - API 項目適用的圖片驗證碼

1. 安裝 gregwar/captcha 圖片驗證碼接口的流程是&#xff1a; 生成圖片驗證碼 生成隨機的 key&#xff0c;將驗證碼文本存入緩存。 返回隨機的 key&#xff0c;以及驗證碼圖片 # 不限于 laravel 普通 php 項目也可以使用額 $ composer require gregwar/captcha2. 開發接口 …

神經網絡算法詳解以及應用場景

神經網絡算法是一類基于神經網絡思想的機器學習算法。神經網絡是一種模擬人腦神經系統的計算模型&#xff0c;由大量的人工神經元組成&#xff0c;這些神經元通過可調的連接權值相互連接&#xff0c;形成復雜的網絡結構。神經網絡具有大規模并行處理、分布式信息存儲、良好的自…

小塔RFID技術幫您解決“倉儲管理危機”!

商品積壓對一個企業帶來的影響是久遠的&#xff0c;倉儲管理流轉失衡&#xff1a;庫存數據不準確、繁瑣人工管理費時費力、商品爆倉及庫存短缺等造成“倉儲管理危機”&#xff0c;讓企業自身陷入困境。 優化倉儲管理&#xff0c;小塔RFID倉儲管理方案輕松解決。利用RFID&#x…

java數據結構與算法刷題-----LeetCode538. 把二叉搜索樹轉換為累加樹

java數據結構與算法刷題目錄&#xff08;劍指Offer、LeetCode、ACM&#xff09;-----主目錄-----持續更新(進不去說明我沒寫完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目錄 解題思路 BST二叉搜索樹&#xff0c;中序遍歷結果為一個升序序列…

【C語言】三子棋

前言&#xff1a; 三子棋是一種民間傳統游戲&#xff0c;又叫九宮棋、圈圈叉叉棋、一條龍、井字棋等。游戲規則是雙方對戰&#xff0c;雙方依次在9宮格棋盤上擺放棋子&#xff0c;率先將自己的三個棋子走成一條線就視為勝利。但因棋盤太小&#xff0c;三子棋在很多時候會出現和…

心得 醒悟

學習是一個學習&#xff0c;遺忘&#xff0c;回憶。。。的一個不間斷個過程&#xff0c;學習python很心急&#xff0c;沒有怎么實操&#xff0c;開著2倍速看視頻&#xff0c;導致看過后很多對列表&#xff0c;字典的命令等等就忘記了&#xff0c;沒有真的學會&#xff0c;導致現…

Unity(第十四部)光照

原始的有默認燈光、除了默認的你還可以創建 1、定向光源&#xff08;類似太陽、從無限遠的地方射向地面的光&#xff0c;光源位置并不影響照射角度等&#xff0c;不同方向的旋轉影響角度和明亮&#xff09; 1. 顏色&#xff1a;調整光的顏色2. 模式&#xff1a;混合是實時加烘…