1. 程式人生 > >Android XML shape 標籤使用詳解(apk瘦身,減少記憶體好幫手)

Android XML shape 標籤使用詳解(apk瘦身,減少記憶體好幫手)

Android XML shape 標籤使用詳解

  一個android開發者肯定懂得使用 xml 定義一個 Drawable,比如定義一個 rect 或者 circle 作為一個 View 的背景。但是,也肯定也有人在能使用 Drawable 的地方選擇使用一張 png 圖(或者是一張 .9 圖)作為 View 的背景,因為後者把問題交給 UI 設計人員去了,省事。當然,使用圖片這種在專案中也很常見,如果不考慮 apk 大小,記憶體佔用問題的話,是沒有任何問題的。如果要給 apk 瘦身,減少記憶體佔用,那麼本文 Drawable 的價值就提現出來了。首先提出幾個問題?

備註:

本文所說的 Drawable 都特指 shape 標籤定義的 Drawable

  • shape 標籤定義的 Drawable 是哪種型別的 Drawable?
  • 使用 Drawable 有什麼好處?
  • 什麼情況下選擇使用 Drawable,而不是使用一張圖,反之呢?
  • shape 標籤能定義多少種類型的 Drawable?(這是本文的重點,方便我這種懶惰的程式設計師直接拷貝程式碼修改)

  本文需要先了解shape標籤的基本用法,關於Android shape標籤的各個屬性詳解請移步:

下面依次回答上面幾個問題

shape標籤定義的Drawable是哪種型別的Drawable?

  shape 標籤定義的 Drawable 型別對應 GradientDrawable

  這裡可能會認為是 ShapeDrawale ,我一開始也是這樣認為的,因為我看到官方文件上說 ShapeDrawable 也是使用 shape 標籤定義的,可是去看 GradientDrawable 的時候也是同樣的解釋,簡直懵逼了,後面經過程式碼實際檢驗,shape 標籤定義的 Drawable 能直接強制轉換為 GradientDrawable,而不能轉換為 ShapeDrawable,這個時候只能認為是 ShapeDrawable 的文件解釋有點問題了,可能文件錯了吧。

  ShapeDrawable 與 GradientDrawale 確實有很多相似之處,具體情況後續單獨寫文章來說明,本文不涉及 ShapeDrawable 的其他內容。

使用Drawable有什麼好處?

  • 很方便得到一個矩形,圓,橢圓,圓環,很容易維護和修改
  • 很方便實現圓角,漸變(線性漸變,徑向漸變,掃描漸變)
  • 代替圖片作為 View 的背景,減少 apk 的體積(減少 apk 體積最明顯最有效的步驟就是去掉圖片)
  • 大圖片耗記憶體,使用 Drawable 節省記憶體,Android 本身對 Drawable 做了很好的優化(記憶體優化需要考慮)

什麼情況下選擇使用Drawable,而不是使用一張圖,反之呢?

  • 理論上能用 Drawable 的地方就用 Drawable
  • 如果能夠通過 shape 標籤就能定義的幾何圖形就能滿足需求,就不用圖片來表示
  • 漸變型別的背景也儘量使用 shape 來實現
  • 不規則的,複雜的圖形還是隻能使用圖片,比如要一個表示手機的圖示,一個人的頭像
  • 有些特殊拉昇效果需要使用 .9.png 圖片(儘可能的小吧,越小越省記憶體)

shape標籤能定義多少種類型的Drawable?

  shape 可以定義四種類型的幾何圖形,由 android:shape 屬性指定

  line --> 線

  rectangle --> 矩形(圓角矩形)

  oval --> 橢圓,圓

  ring --> 圓環

  shape 可以定義邊框屬性

  有邊框,無邊框,虛線邊框,實線邊框

  shape 可以實現矩形圓角效果

  可以指定其中一個角或者多個角設定圓角效果

  指定圓角半徑設定圓角的大小

  shape 可以實現三種漸變,由子標籤 gradient 實現

  linear --> 線性漸變(水平,垂直,對角線三個漸變)

  sweep --> 掃描漸變(只支援順時針方向,其實顏色反過來就跟逆時針一樣的了)

  radial --> 徑向漸變(由指定的中心點開始向外漸變,指定半徑)

  xml 實現只支援三個顏色,startColor,CenterColor,endColor

  由上面的組合可以定義很多 Drawable,下面依次進行介紹:

線(實線+虛線)

  

實線:line_solid.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 實線 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line"
    android:useLevel="true">

<stroke
    android:width="2dp"
    android:color="#ffff0000" />

</shape>

虛線:line_dashed.xml

<?xml version="1.0" encoding="utf-8"?>
<!--虛線
    設定型別會line
    需要關閉硬體加速虛線才能繪製出來,佈局檔案中使用的時候需要設定android:layerType="software"
    android:width 線寬,佈局檔案中的View的高度需要比這個值大才可以繪製出來
    android:dashWidth 每段破折線的長度
    android:dashGap="5dp"每段破折線之間的間隔-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line"
    android:useLevel="true">

    <stroke
        android:width="2dp"
        android:dashGap="5dp"
        android:dashWidth="10dp"
        android:color="#ffff0000" />

</shape>

矩形(邊框+填充)

  

矩形實線邊框內部無填充:rect_solid_border.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 實線邊框 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <stroke
        android:width="2dp"
        android:color="#ffff0000" />

</shape>

矩形虛線邊框內部無填充:rect_dashed_border.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 虛線邊框 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <stroke
        android:width="2dp"
        android:color="#ffff0000"
        android:dashGap="5dp"
        android:dashWidth="10dp" />

</shape>

矩形實線邊框-內部填充:rect_solid_border_and_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 實線邊框+內部填充 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <stroke
        android:width="2dp"
        android:color="#ffff0000" />

    <solid android:color="#ff00ffff" />

</shape>

矩形虛線邊框-內部填充:rect_dashed_border_and_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 虛線邊框+內部填充 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <stroke
        android:width="2dp"
        android:color="#ffff0000"
        android:dashGap="5dp"
        android:dashWidth="10dp" />

    <solid android:color="#ff00ffff" />
</shape>

圓角矩形

  

圓角矩形-只有邊框:rect_rounded_border.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形邊框圓角 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size android:height="100dp"
        android:width="100dp"/>

    <stroke
        android:width="2dp"
        android:color="#ffff0000" />

    <corners android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp" />

</shape>

圓角矩形-只有內部填充:rect_rounded_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 圓角矩形 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size android:height="100dp"
        android:width="100dp"/>

    <solid android:color="#8000ff00" />

    <corners android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp" />

</shape>

圓角矩形-有邊框有填充:rect_rounded_border_and_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形邊框+填充 圓角 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size android:height="100dp"
        android:width="100dp"/>

    <stroke
        android:width="2dp"
        android:color="#ffff0000" />

    <solid android:color="#8000ff00" />

    <corners android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp" />

</shape>

圓角矩形-左邊圓角為一個半圓弧:rect_rounded_left_arc.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圓角+左右兩邊為一個圓弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size
        android:width="50dp"
        android:height="10dp" />

    <solid android:color="#8000ff00" />

    <!-- 圓角半徑是高度的一般就是一個圓弧了 -->
    <corners
        android:bottomLeftRadius="20dp"
        android:topLeftRadius="20dp" />

</shape>

圓角矩形-左右兩邊都是半圓弧:rect_rounded_left_right_arc.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圓角+左右兩邊為一個圓弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size
        android:width="50dp"
        android:height="10dp" />

    <solid android:color="#8000ff00" />

    <!-- 圓角半徑是高度的一般就是一個圓弧了 -->
    <corners android:radius="20dp" />

</shape>

圓角矩形-左右兩邊都是半圓弧-帶邊框:rect_rounded_left_right_arc_border.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圓角+左右兩邊為一個圓弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size
        android:width="50dp"
        android:height="10dp" />

    <stroke android:color="#ffff0000"
        android:width="2dp"/>

    <solid android:color="#8000ff00" />

    <!-- 圓角半徑是高度的一般就是一個圓弧了 -->
    <corners android:radius="20dp" />

</shape>

圓角矩形-圓:rect_rounded_arc.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圓角+圓出一個圓弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size android:height="10dp"
        android:width="10dp"/>

    <solid android:color="#8000ff00" />

    <corners android:radius="20dp" />

</shape>

圓角矩形-上下兩邊半圓弧:rect_rounded_top_bottom_arc.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形圓角+左右兩邊為一個圓弧 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size
        android:width="10dp"
        android:height="60dp" />

    <solid android:color="#8000ff00" />

    <!-- 圓角半徑是高度的一般就是一個圓弧了 -->
    <corners android:radius="10dp" />

</shape>

漸變效果(以矩形為例)

  

垂直線性漸變:rect_gradient_linear_vertical.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形內部填充-線性垂直漸變 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">

    <size
        android:width="@dimen/shape_size"
        android:height="@dimen/shape_size" />

    <stroke
        android:width="1px"
        android:color="#ffff00ff" />

    <!-- 調整angle實現水平漸變,垂直漸變或者對角漸變 -->
    <gradient
        android:angle="-45"
        android:centerX="0.5"
        android:centerY="0.4"
        android:centerColor="#8000ff00"
        android:endColor="#1000ff00"
        android:startColor="#ff00ff00"
        android:type="linear" />
</shape>

水平線性漸變:rect_gradient_linear_horizon.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 矩形內部填充-線性水平漸變 -->

            
           

相關推薦

Android XML shape 標籤使用apk減少記憶體幫手

Android XML shape 標籤使用詳解   一個android開發者肯定懂得使用 xml 定義一個 Drawable,比如定義一個 rect 或者 circle 作為一個 View 的背景。但是,也肯定也有人在能使用 Drawable 的地方選擇使用一

Android 抓包使用包括windows用filddder和mac用Charles

MAC環境下推薦用Charles:  HTTP包: 2.用安裝了charles的電腦,代理待抓包anroid手機的網路連線:      首先檢視pc的網路IP地址;開啟手機設定,進入當前wifi連線,設定代理為手動,將伺服器填為上一步中獲得的IP,埠預設為8888(在charles的

ThreadLocal不看後悔一看必懂

ThreadLocal概要 我們可以使用synchorinized 關鍵字來為變數加鎖以解決執行緒安全問題,從而限制只能有一個執行緒來使用此變數,但是加鎖會大大影響程式執行效率 ThreadLocal是執行緒區域性變數(從執行緒的角度看,目標變數就像是執行緒的本地變數), 通常

ThreadPoolExecutor不看後悔一看必懂

構造器引數分析 第四個構造器原始碼 corePoolSize:核心池的大小 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數數目少於corePoolSize時,有新任務進來就新建一個執行緒,即使

VS2015+QT5.8 程式打包釋出包含圖片打包附工具和原始碼

之前按照百度的釋出教程,在自己的電腦打得開,在別人電腦打不開,弄了一會,總結的經驗如下: 1.打包程式 第一步:在vs2015中,以release方式除錯程式,然後會在專案資料夾的x64\relea

C++模板的特化函式模版特殊類模版特化

模版與特化的概念 函式模版與類模版 C++中模板分為函式模板和類模板 函式模板:是一種抽象函式定義,它代表一類同構函式。 類模板:是一種更高層次的抽象的類定義。 特化的概念 所謂特化,就是將泛型的東東搞得具體化一些,從字面上

Laravel Excel實現Excel/CSV檔案匯入匯出的功能合併單元格設定單元格樣式

Laravel Excel實現Excel/CSV檔案匯入匯出(合併單元格,設定單元格樣式) 這篇文章主要給大家介紹了關於在Laravel中如何使用Laravel Excel實現Excel/CSV檔案匯入匯出功能的相關資料,文中通過示例程式碼介紹的非常詳細,對大

android studio 簽名遇到的坑apk無法安裝安裝後閃退

今天需要拿出一個版本提測,打包好以後發給測試,測試反饋安裝上以後無法開啟,一開啟就閃退。 在網上找了些資料,也有遇到同樣問題的小夥伴,在此學習總結一下; 1.android studio 打包簽名後無法安裝到手機,總是安裝失敗。這時可能是在打包的時候沒有勾選圖中兩個。 2

樹狀陣列處理線上資料求逆序對

一、樹狀陣列概論。 一、1 樹狀陣列C[I]含義:C[i]陣列的含義為從I開始,向左數一個特殊值(low=I and -i)這個區間內元素的和。也就是說C[i]:=Sum(A[j],i-low+1=<k<=i) 一、2 A陣列重要嗎:不重要 二、樹

Android XML shape 標籤使用

一個android開發者肯定懂得使用 xml 定義一個 Drawable,比如定義一個 rect 或者 circle 作為一個 View 的背景。但是,也肯定也有人在能使用 Drawable 的地方選擇使用一張 png 圖(或者是一張 .9 圖)作為 View 的背景

Android Drawable資源中selector、layer-list和shape標籤

在實際開發中,我們經常會對控制元件的樣式進行一些修改已滿足我們的要求,這時候就會引用 Drawable 資源的樣式檔案。 1、StateListDrawable 資源         StateListDrawable 用於組織多個 Drawable 物件。當使用 Stat

Android:shape屬性圖文並茂

語法結構: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.and

Android EventBus3.x 使用

led AC target 分解 感覺 div activit .org android事 ?(^∇^*) 五一假期在家無事,新項目中用的是RxJava2+EventBus感覺還不錯,趁這閑暇總結下EventBus 一、概要簡述   EventBus

logback logback.xml常用配置<configuration> and <logger>

配置文件 cti 原創文章 分類 lis ali 配置 默認值 原創 摘自:http://aub.iteye.com/blog/1101260logback logback.xml常用配置詳解(一)<configuration> and <logger&

h5標籤新增的以及改良的

文章來自:原始碼線上https://www.shengli.me/h5/62.html      1、progress 標籤:進度條;   2、ol標籤改良:starttype reversed;翻轉排序;   3、dat

shape標籤

前言:最近也是忙的夠嗆,但要總結還是要總結出來,不然過段時間就不想寫部落格了,堅持每月至少出四篇部落格的節奏,無論多忙,堅持。任何一個成功人物的背後總是透露著辛酸與不易。 今天看到一篇文章《世界是公平的:你富不過馬雲,比慘你也未必比的過》,分享給大家,

Android應用程式啟動從原始碼瞭解App的啟動過程

本文承接《Android應用程式啟動詳解(一)》繼續來學習應用程式的啟動的那些事。上文提到startActivity()方法啟動一個app後經過一翻過程就到了app的入口方法ActivityThread.main()。其實我們在之前的文章中《Android的訊息機制(二)之L

web.xml 各個標籤

對於web專案,web.xml可有,也可以沒有。但是對於大型的web專案使用web.xml會很方便的。 1.web.xml是專案的入口 2.web.xml可以做的事: 指定歡迎頁面 指定錯誤頁面、 命名與定製url 定製初始化引數 設定過濾器 .設定監

logback logback.xml常用配置 and

部落格分類:  Log 詳細整理了logback常用配置, 不是官網手冊的翻譯版,而是使用總結,旨在更快更透徹的理解其配置 logback 中文手冊 (官網手冊的翻譯版,在這裡向中文版譯者-陳華,說聲辛苦啦) logback 配置詳解(

logback logback.xml常用配置

logback 常用配置詳解(二) <appender> <appender>: <appender>是<configuration>的子節點,是負責寫日誌的元件。 <appender>有兩個必要屬