1. 程式人生 > >領略千變萬化的Android Drawable (一)

領略千變萬化的Android Drawable (一)

Android Drawable 相信大家都不陌生,本篇我們就來全面深入瞭解它,Drawable是一種可以在Canvas上進行繪製的抽象的影象,它的子類也相當多,所以在開發中很容易導致我們對不同Drawable的理解產生混亂,因此我們很有必要來全面瞭解一下Drawable的子類及其使用方式滴,哈~。

一、Drawable的簡述

Drawable在我們開發中常被用來作為View的背景影象,一般情況下我們都是通過XML來定義Drawable的,當然我們也可以通過程式碼建立Drawable,只不過會比較複雜而已。Drawable最大的好處就是可以方便我們做出一些特殊的UI效果,這點比我們自定義View實現的效果來得更容易些。因此深入理解Drawable的用法還是很有必要的,接下來我們來看看Drawable的一些特性:

  • 1、Drawable本身表示的只是一種影象的概念,因此Drawable不僅僅是圖片,也可以是顏色構造出來的影象效果(後面會說明)。
  • 2、Drawable本身是一個抽象類,因此具體的實現都是由子類完成的,比如ShapeDrawable,BitmapDrawable等。
  • 3、Drawable的內部寬高可以分別通過getIntrinsicWidth()和getIntrinsicHeight()獲取,但並不是所有的Drawable都有內部寬高的屬性,比如一個顏色形成的Drawable並沒有寬高的概念。在大多數情況下,Drawable並沒有大小的概念,因為當Drawable作為View的背景圖時,Drawable會被拉伸至View的同等大小。

二、千變萬化的Drawable

1、BitmapDrawable

BitmapDrawable 是對bitmap的一種包裝,可以設定它包裝的bitmap在BitmapDrawable區域內的繪製方式,如平鋪填充、拉伸填充或者保持圖片原始大小,也可以在BitmapDrawable區域內部使用gravity指定的對齊方式。其語法如下:

Java
123456789101112 <?xml version="1.0"encoding="utf-8"?><bitmapxmlns:android="http://schemas.android.com/apk/res/android"android:src="@[package:]drawable/drawable_resource"android:antialias=["true"|"false"]android:dither=["true"|"false"]android:filter=["true"|"false"]android:gravity=["top"|"bottom"|"left"|"right"|"center_vertical"|"fill_vertical"|"center_horizontal"|"fill_horizontal"|"center"|"fill"|"clip_vertical"|"clip_horizontal"]android:tileMode=["disabled"|"clamp"|"repeat"|"mirror"]/>

我們分析一下這些屬性的含義:

android:src

型別:Drawable resource。必需。 引用一個drawable resource.

android:antialias

型別:Boolean。是否開啟抗鋸齒。開啟後圖片會變得更平滑些,因此一般建議開啟,設定為true即可。

android:dither

型別:Boolean。是否允許抖動,如果點陣圖與螢幕的畫素配置不同時,開啟這個選項可以讓高質量的圖片在低質量的螢幕上保持較好的顯示效果(例如:一個位圖的畫素設定是 ARGB 8888,但螢幕的設定是RGB 565,開啟這個選項可以是圖片不過於失真)一般建議開啟,為true即可。

android:filter

型別:Boolean。是否允許對點陣圖進行濾波。當圖片被壓縮或者拉伸時,使用濾波可以獲得平滑的外觀效果。一般建議開啟,為true即可

android:gravity

當圖片小於容器尺寸時,設定此選項可以對圖片經典定位,這個屬性比較多,不同選項可以使用‘|’來組合使用。

可選項 含義
top 將圖片放在容器頂部,不改變圖片大小
bottom 將圖片放在容器底部,不改變圖片大小
left 將圖片放在容器左側,不改變圖片大小
right 將圖片放在容器右側,不改變圖片大小
center_vertical 圖片豎直居中,不改變圖片大小
fill_vertical 圖片豎直方向填充容器
center_horizontal 圖片水平居中,不改變圖片大小
fill_horizontal 圖片水平方向填充容器
center 使圖片在水平方向和豎直方向同時居中,不改變圖片大小
fill 圖片填充容器,預設值
clip_vertical 豎直方向剪下,很少使用
clip_horizontal 水平方向剪下,很少使用

android:mipMap

紋理對映處理技術,不太懂,不過一般也不用,預設為false

android:tileMode

平鋪模式。共有以下幾個值
disabled :預設值,表示不使用平鋪
clamp :複製邊緣色彩
repeat :X、Y 軸進行重複圖片顯示,也就是我們說要說的平鋪
mirror :在水平和垂直方向上使用交替映象的方式重複圖片的繪製

三者區別如下圖:

BitmapDrawable的xml使用方式比較簡單,我們這裡就不貼案例了哈。接下來我們來看看在程式碼中如何使用BitmapDrawable。


實際上我們從BitmapDrawable的原始碼可以看出,目前Google建議我們建立BitmapDrawable的構造方法有3種

12345 publicBitmapDrawable(Resources res,Bitmap bitmap)publicBitmapDrawable(Resources res,Stringfilepath)publicBitmapDrawable(Resources res,java.io.InputStream is)

引數比較簡單,res就是我們通過getResource()獲取到的資源管理物件,bitmap就是我們需要用BitmapDrawable包裝的圖片物件,filepath,需要包裝的圖片所在路徑,is則是一個影象流,需要轉換成 BitmapDrawable。但是在大多數情況下我們還是建議使用xml實現比較好,程式碼實現我們不打算深究,我們這裡直接給出一個程式碼應用案例:

1234567 Bitmap mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.image1);BitmapDrawable mBitmapDrawable=newBitmapDrawable(getResources()mBitmap);mBitmapDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);//平鋪方式mBitmapDrawable.setAntiAlias(true);//抗鋸齒mBitmapDrawable.setDither(true);//防抖動//設定到imageView上即可imageView.setImageDrawable(mBitmapDrawable);

2、NinePatchDrawable

NinePatchDrawable表示的是我們熟悉的.9格式的圖片,.9圖片可以在保證圖片不失真的情況下任意進行縮放,在實際的使用中我們也是通過Xml來實現即可:

Java
123 <nine-patch xmlns:android="http://schemas.android.com/apk/res/android"android:src="drawable/resource"android:dither="[true|false]"/>

屬性和BitmapDrawable中屬性的含義相同,這裡不過多描述。一般情況下不建議程式碼建立.9圖,因為Android雖然可以使用Java程式碼建立NinePatchDrawable,但是極少情況會那麼做,這是因為由於Android SDK會在編譯工程時對點九圖片進行編譯,形成特殊格式的圖片。使用程式碼建立NinePatchDrawable時只能針對編譯過的點九圖片資源,對於沒有編譯過的點九圖片資源都當做BitmapDrawable對待。還有點需要特別注意的是,點九圖只能適用於拉伸的情況,對於壓縮的情況並不適用,如果需要適配很多解析度的螢幕時需要把點九圖做的小一點。

3、ShapeDrawable

ShapeDrawable對於Xml的shape標籤,在實際開發中我們經常將其作為背景圖片使用,因為ShapeDrawable可以幫助我們通過顏色來構造圖片,也可以構造漸變效果的圖片,總之,ShapeDrawable足矣滿足我們大部分特殊需求下面我們說說其使用方法:

Java
123456789101112131415161718192021222324252627282930313233343536 <?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="integer"android:centerY="integer"android:centerColor="integer"android:endColor="color"android:gradientRadius="integer"android:startColor="color"android:type=["linear"|"radial"|"sweep"]android:usesLevel=["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的子元素包括、<gradient>、<padding>、<size>、<solid>、<stroke>,我們一個個分析。
android:shape
這個屬性表示影象的形狀,可以是rectangle(矩形)、oval(橢圓)、line(橫線)、ring(圓環)。預設為rectangle。
這裡對於ring值還有幾個相關的屬性:

屬性 含義
android:innerRadius 圓環的半徑與android:innerRadiusRatio同時存在時,以android:innerRadius 為準
android:innerRadiusRatio 內半徑佔整個Drawable寬度的比例,預設值為9.如果為n,那麼半徑=寬度/n
android:thickness 圓環的厚度,即外半徑減去內半徑的大小與android:thicknessRatio同時存在時以android:thickness為準
android:thicknessRatio 厚度佔整個Drawable寬度比例,預設值為3,如果為n,那麼厚度=寬度/n
android:useLevel 一般都應該使用false,否則可能無法達到預期顯示效果,除非它被當做LevelListDrawable來使用。

指定邊角的半徑,數值越大角越圓,數值越小越趨近於直角,引數為:

123456 cornersandroid:radius="integer"android:topLeftRadius="integer"android:topRightRadius="integer"android:bottomLeftRadius="integer"android:bottomRightRadius="integer"/>

Android:radius直接指定4個角的半徑,另外4個屬性可以單獨設定4個角的角度.

設定顏色漸變與為互斥標籤,因為solid表示純色填充,而gradient表示漸變填充。

屬性 含義
android:angle 漸變的角度,預設為0,其值務必為45°的倍數,0表示從左到右,90表示從下到上。
android:centerX 漸變中心點的橫座標
android:centerY 漸變的中心點的縱座標,漸變中心點會影響漸變的具體效果。
android:startColor 漸變的開始顏色
android:centerColor 漸變的中間顏色
android:endColor 漸變的結束顏色
android:gradientRadius 漸變的半徑,當android:type=”radial”有效
android:useLevel 一般為false
android:type 漸變類別,linear(線性)為預設值,radial(徑內漸變),sweep(掃描漸變)

angle=0和angle=90的區別(都為線性漸變):

linear(線性)為預設值,radial(徑內漸變),sweep(掃描漸變)區別如下:

到這裡我們利用前面的介紹的知識點來實現一個環形進度圈的案例,我們將shape屬性設定為ring(圓環),然後再設定其內半徑以及環的厚度,並設定漸變色調,shape_drawable.xml程式碼如下:

Java
123456789101112131415 <?xml version="1.0"encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:innerRadius="20dp"android:shape="ring"android:thickness="8dp"android:useLevel="false"><gradient android:angle="0"android:startColor="@color/normal"android:centerColor="#5027844F"android:endColor="#fff"android:useLevel="false"android:type="sweep"/></shape>

效果如下:

接著,我們將該自定義環形圈設定給一個旋轉動畫,並利用該旋轉動畫自定義成一個環形進度圈的style,最後將該自定義的style賦值給Progress元件。程式碼如下:
自定義旋轉動畫progress_rotate.xml:

Java
123456789 <?xml version="1.0"encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/shape_drawable"android:pivotX="50%"android:pivotY="50%"android:fromDegrees="0"android:toDegrees="360"></rotate>

自定義Progress的style:

Java
1234567 <style name="CustomProgressStyle" ><item name="android:indeterminateDrawable">@drawable/progress_rotate</item><item name="android:minWidth">72dp</item><item name="android:maxWidth">72dp</item><item name="android:minHeight">72dp</item><item name="android:maxHeight">72dp</item></style>

應用到Progress元件

1234567 ProgressBarandroid:

相關推薦

領略千變萬化Android Drawable

Android Drawable 相信大家都不陌生,本篇我們就來全面深入瞭解它,Drawable是一種可以在Canvas上進行繪製的抽象的影象,它的子類也相當多,所以在開發中很容易導致我們對不同Drawable的理解產生混亂,因此我們很有必要來全面瞭解一下Drawable的子類及其使用方式滴,哈~。 一、D

領略千變萬化Android Drawable

7、TransitionDrawable 很多時候我們在實現漸變的動畫效果時,都會使用到animation,但實際上我們有既簡單又完美的解決方法,沒錯,它就是TransitionDrawable啦,TransitionDrawable用於實現兩個Drawable之間的淡入淡出的效果,它對應的是<tra

Android MVC MVC簡介

mvc tar .com 程序 tro view 用戶界面 lis 代碼 今天有朋友和我提到Android中的MVC模式,自己就在這裏總結下,如有不妥,大家盡情批評指教 MVC框架簡介   MVC全名是Model View Controller,是模型(model)-視圖(

Android學習--安卓四大元件

 Android有四大元件,分別是Activity,Service,Content Provider和Broadcast Receiver。   首先說明Activity元件,開發一個應用程式不用到Activity是很難的,一個Activity通常就是一個獨立的視窗或

Android學習—— Android studio的安裝與配置

          最近事比較少,想著做一系列Android的學習,把自己當時遇到的一些整理一下,方便新學android的人學習 首先先來安裝編寫Android的軟體,我這裡用的是android studio Android studio安裝與配

Android動畫-檢視動畫

概述 Android開發中一直會遇到各種動畫效果,特別是如果老闆和UI妹子很扣這塊的話。這也是每一個Android程式設計師無法繞過的一塊內容,目前專案不忙,終於有時間來系統的整理下Android中的動畫。 Android中動畫分為: 幀動畫(Frame Anim),像幻

Android學習

分析 構建 新的 studio 字符串解析 ble 學習 nullable android學習 Android 系統架構 linux內核層 系統運行庫層 應用框架層 應用層 Android 的四大組件 活動(Activity) 服務(S

android開發

開始android歷程: 1、模擬器無法連線本地PC:       模擬器中可以連外網,但無法訪問本地PC上的IIS的API介面:報connect refused錯誤。      後試了很多方法,修改模擬器網址等,沒用。 &

Android GreenDAO

GreenDao是一個高效的資料庫訪問ORM框架,節省了自己編寫SQL的時間,快速的增刪查改等操作。 配置GreenDao 新增在工程的build.gradle // In your root build.gradle file: buildscript {

android-hybird

hybird混合開發是現在應用開發中非常常見的 1.成本低,展示豐富 有些公司的產品剛剛開始可能甚至只投入後h5的應用,也就是你開啟應用,都是h5頁面。為什麼呢,成本低啊 2.h5展示,更新方便 h5真是的web頁面,是後臺推送來的資料,由伺服器隨時更新,而應用端不用

Android備忘錄

1.獲取和設定螢幕的點選事件 input text 1234  向介面注入1234文字,有輸入框,可以明顯看到效果 input keyevent 4  向螢幕傳送鍵盤事件,4是返回 input tap 100 300 單機觸屏事件,模擬點選x=100,y=300位置 inp

react-native-android-unityreact-native加入android原生

 本人是做後端php的,對各類語言和方向都有興趣,多而不精。最近公司專案有一個移動端app,決定採用react-native開發,專案中有這麼個要求,要求react-native中嵌入原生頁面,然後原生頁面嵌入unity,並實現原生和unity之前相互通訊,網路查詢資料後實現

ReactNative 呼叫Android 原生——原生模組()

前言 React native呼叫Android原生主要2種方式: 1、呼叫原生模組 2、呼叫原生元件 這裡之所以強調有2種方式主要是自己剛開始弄rn調原生的時候感覺很懵,感覺沒有學習的方向,所以提醒一

ReactNative 呼叫Android 原生——原生模組(二)

ReactNative 呼叫Android 原生(一)——原生模組(一):https://blog.csdn.net/danfengw/article/details/83862623 在上次文章中我們只是簡單的嘗試了rn給Android原生傳遞引數呼叫Andr

Android例項—— 3D畫廊

3D畫廊 之前我都是寫的學習的內容,我在寫這些教程時遇到有趣的炫酷的小例子也會專門拿出來寫一篇文章,今天就寫一個酷炫的小例子,叫3D畫廊,它是屬於ViewPage的進階版。 下面的指示器是使用的一大神的第三方庫,會在文章下方簡單講述一下。 效果圖 3D畫廊的實現 首先是佈局檔案 1 <Frame

Android開發——Android-Studio 開發環境配置

第一步:下載Android-Studio 地址1:https://developer.android.com/studio/index.html?hl=zh-cn第二步:安裝JDK和配置環境變數 由於我下載Android-Studio的版本JDK需要在8.0版本以上,所以如果

Android 面試題總結之Android 基礎

Android 面試題總結之Android 基礎Activity(一) 轉眼間畢業好久了,寫程式也很久了,從高中就一直寫到現在好多年了啊,學習了很多東西,把之前整理的資料和知識點慢慢分享出來。這裡主要總結Android可能出的面試的題目比較全面\詳細,持

Android 安全》AndroidManifest.xml之allowBackup屬性

前言 " android:allowBackup"是一個是否允許備份系統和使用者資料的屬性。 當這個標誌被設定為true時應用程式資料可以在手機未獲取 ROOT 的情況下通過adb除錯工具來備份和恢復。 案例分析 從應用商城裡下載一個“密碼本”之類的應用。 1. 使用An

Android tips-->Android統一顯示¥符號

新版本一個需求在使用者介面上需要顯示中文金額符號“¥”,結果這個字元在有的Android手機上顯示一個橫槓,在有的手機上顯示兩個橫槓,這是因為不同的android手機自帶的系統字型是不一致的,因此這個金額符號顯示的可能也不一致,這種需求有幾種方式: (1)不管他(就是直接根據系統自帶的

Android 動畫幀動畫、補間動畫

1.Frame Animation(幀動畫) 幀動畫就是把多張圖片在定義的短時間內完成順序播放,最終呈現在視覺上的動態效果;幀動畫首先得具有圖片資源。 下面是幀動畫在Android開發中的具體實現: (1)activity_main.xml檔案: <