欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Android中Drawable使用知識(shí)總結(jié)

 更新時(shí)間:2017年12月19日 10:00:04   作者:陰月有晴_  
本篇文章主要介紹了淺談Android中Drawable使用知識(shí)總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文是學(xué)習(xí)《Android開發(fā)藝術(shù)探索》中Drawable章節(jié)之后的一個(gè)總結(jié)。

Drawable在我們平時(shí)的開發(fā)中,基本都會(huì)用到,而且給大家非常的有用。那么什么是Drawable呢?能夠在canvas上繪制的一個(gè)玩意,而且相比于View,并不需要去考慮measure、layout,僅僅只要去考慮如何draw(canavs)。當(dāng)然了,對(duì)于Drawable傳統(tǒng)的用法,大家肯定不陌生 ,今天主要給大家?guī)?lái)以下幾個(gè)Drawable的用法:

1、自定義Drawable,相比View來(lái)說(shuō),Drawable屬于輕量級(jí)的、使用也很簡(jiǎn)單。以后自定義實(shí)現(xiàn)一個(gè)效果的時(shí)候,可以改變View first的思想,嘗試下Drawable first。

2、自定義狀態(tài),相信大家對(duì)于State Drawable都不陌生,但是有沒(méi)有嘗試過(guò)去自定義一個(gè)狀態(tài)呢?

3、利用Drawable提升我們的UI Perfermance , 如何利用Drawable去提升我們的UI的性能。

一、常見的Drawable種類介紹

Drawable類 xml標(biāo)簽 描述
BitmapDrawable <bitmap/> 表示一張圖片,與直接引用原始圖片相比可以設(shè)置一些效果
ShapeDrawable <shape/> 通過(guò)顏色構(gòu)造各種形狀的圖形,標(biāo)簽對(duì)應(yīng)的實(shí)體類實(shí)際是GradientDrawable
LayerDrawable <layer-list/> 表示一種層次化的Drawable集合,可以將不同的Drawable放置在不同的層上達(dá)到疊加效果
StateListDrawable <selector/> 表示一種Drawable集合,集合中每個(gè)Drawable對(duì)應(yīng)著View的一種狀態(tài),最常用于Button
LevelListDrawable <level-list/> 表示一種Drawable集合,集合中每個(gè)Drawable(item)都有一個(gè)等級(jí)(level)的概念??梢愿鶕?jù)不同的等級(jí)切換對(duì)應(yīng)的Drawable。每個(gè)Drawable(item)對(duì)應(yīng)一個(gè)等級(jí)范圍,可以通過(guò)Drawable的setLevel方法來(lái)切換,如果用作ImageView的前景,還可以通過(guò)ImageView的setImageLevel方法來(lái)切換Drawable。level范圍0-10000。
TransitionDrawable <transition/> 用于實(shí)現(xiàn)兩個(gè)Drawable之間的淡入淡出效果,通過(guò)該Drawable中的startTransition和reverseTransition方法實(shí)現(xiàn)淡入淡出和逆過(guò)程,兩個(gè)方法接收一個(gè)時(shí)間參數(shù)。
InsetDrawable <inset/> 可以將其他Drawable內(nèi)嵌到自己當(dāng)中,并且可以在四周流出一定的距離。當(dāng)一個(gè)View希望背景比自己實(shí)際區(qū)域小的時(shí)候,可以用這個(gè)Drawable。LayerDrawable可以實(shí)現(xiàn)相同的效果
ScaleDrawable <scale/> 可以根據(jù)自己的等級(jí)將指定的Drawable縮放到一定的比例。
ClipDrawable <clip/> 根據(jù)自己當(dāng)前的等級(jí)來(lái)裁剪另一個(gè)Drawable,裁剪方向可以通過(guò)android:clipOrientation和android:gravity兩個(gè)屬性共同控制。

二、各種Drawable的xml屬性詳解

1.<bitmap/>

<bitmap
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:src="圖片資源id"
 android:antialias="true|false" 
 android:dither="true|false"
 android:filter="true|false"
 android:gravity="..."
 android:mipMap="true|false"
 android:tileMode="disabled|clamp|repeat|mirror" />

antialias抗鋸齒,開啟后會(huì)讓圖片變得平滑,同時(shí)也會(huì)在一定程度上降低圖片的清晰度,但是降低的幅度低至可以忽略,所以應(yīng)該開啟;

dither抖動(dòng)效果,當(dāng)圖片的像素配置與手機(jī)屏幕的像素配置不一致時(shí),開啟這個(gè)選項(xiàng)可以讓高質(zhì)量圖片在低質(zhì)量的屏幕上還能保持較好的顯示效果,比如圖片的色彩模式為ARGB8888,但是設(shè)備屏幕所支持的色彩模式為RGB555,這時(shí)候開啟抖動(dòng)選項(xiàng)可以讓圖片顯示不會(huì)過(guò)于失真,在Android中創(chuàng)建Bitmap一般會(huì)選用ARGB8888這個(gè)模式,在這種色彩模式下一個(gè)像素所占的大小為4個(gè)字節(jié),一個(gè)像素的位數(shù)總和越高,圖像也就越逼真。根據(jù)分析,抖動(dòng)效果應(yīng)該開啟;

filter過(guò)濾效果,當(dāng)圖片尺寸被拉伸或壓縮時(shí),過(guò)濾可以保持較好的顯示效果,應(yīng)該開啟;

mipMap一種圖像處理技術(shù),不常用,默認(rèn)false即可;

titleMode平鋪模式。

點(diǎn)9圖片對(duì)應(yīng)NinePatchDrawable,xml標(biāo)簽是<nine-patch/>

2.<shape/>

<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="integer"
  android:centerY="integer"
  android:centerColor="color"
  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>

android:shape圖形形狀,四個(gè)選項(xiàng):rectangle(矩形)、oval(橢圓)、line(橫線)、ring(圓環(huán))。默認(rèn)是矩形,line和ring必須通過(guò)<stroke>標(biāo)簽來(lái)指定線的寬度和顏色等信息,否則無(wú)法達(dá)到預(yù)期的顯示效果。

針對(duì)ring這個(gè)形狀,有5個(gè)特殊屬性:

android:innerRadius 內(nèi)環(huán)半徑,與android:innerRadiusRatio同時(shí)存在時(shí),以android:innerRadius為準(zhǔn)
android:thickness 圓環(huán)厚度,即外半徑減去內(nèi)半徑的大小,與android:thicknessRatio同時(shí)存在時(shí)以android:thickness為準(zhǔn)
android:innerRadiusRatio 內(nèi)半徑占整個(gè)Drawable的寬度比例,默認(rèn)值9。如果是n,那么內(nèi)半徑=寬度/n
android:thicknessRatio 厚度占整個(gè)Drawable的寬度比例,默認(rèn)值3。如果是n,那么厚度=寬度/n
android:useLevel 一般都應(yīng)該使用false,否則有可能無(wú)法達(dá)到預(yù)期效果,除非被當(dāng)作LevelListDrawable來(lái)使用

<corners>

表示四個(gè)角的角度,只適用于shape,這里的角度指的是圓角的程度,用px來(lái)表示,5個(gè)屬性:

  1. android:radius 四個(gè)角同時(shí)設(shè)定相同的角度,優(yōu)先級(jí)較低,會(huì)被其他4個(gè)屬性覆蓋。
  2. android:topLeftRadius 左上角
  3. android:topRightRadius 右上角
  4. android:bottomLeftRadius 左下角
  5. android:bottomRightRadius 右下角

<gradient>

表示漸變色,與<solid>純色標(biāo)簽互斥,屬性如下:

  1. android:angle 漸變的角度,影響漸變方向,默認(rèn)為0,值必須是45的倍數(shù),比如0表示從左到右,90表示從上到下
  2. android:centerX 漸變中心點(diǎn)的橫坐標(biāo)
  3. android:centerY 漸變中心點(diǎn)的縱坐標(biāo),漸變的中心點(diǎn)影響漸變的具體效果
  4. android:startColor 漸變的起始色
  5. android:centerColor 漸變的中間色
  6. android:endColor 漸變的結(jié)束色
  7. android:gradientRadius 漸變半徑,僅當(dāng)type=radial時(shí)有效
  8. android:type 漸變類別,有三個(gè)值:linear(線性漸變)、radial(徑向漸變)、sweep(掃描線漸變)。默認(rèn)是線性漸變。
  9. android:useLevel 一般為false,當(dāng)作為StateListDrawable使用時(shí)為true

<solid>

純色填充,屬性android:color表示填充顏色

<stroke>

Shape的描邊,屬性如下:

  1. android:width 描邊的寬度,越大shape的邊緣性看起來(lái)越粗
  2. android:color 描邊的顏色
  3. android:dashWidth 組成虛線的線段的寬度
  4. android:dashGap 組成虛線的線段之間的間隔
  5. android:dashWidth和android:dashGap有一個(gè)為0,那么虛線效果不生效。

<padding>

表示包含它的View的空白,有上下左右四個(gè)屬性。

<size>

shape的大小,但不是shape最終的大小因?yàn)閟hape一般會(huì)自適應(yīng)View的寬高。

3.<layer-list/>

<layer-list
 xmlns:android="http://schemas.android.com/apk/res/android" >
 <item
  android:drawable=""
  android:id=""
  android:top=""
  android:right=""
  android:bottom=""
  android:left="" />
</layer-list>

一個(gè)layer-list可以包含多個(gè)item,每個(gè)item表示一個(gè)Drawable。

android:top android:right android:bottom android:left設(shè)置上下左右的偏移量。

android:drawable 直接引用一個(gè)Drawable資源,也可以在item中自定義Drawable。

默認(rèn)情況layer-list中的所有Drawable都會(huì)被縮放至View的大小

4.<selector/>

<selector
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:constantSize="true|false"
 android:dither="true|false"
 android:variablePadding="true|false"
 >
 <item
  android:drawable=""
  android:state_pressed="true|false"
  android:state_focused="true|false"
  android:state_hovered="true|false"
  android:state_selected="true|false"
  android:state_checkable="true|false"
  android:state_checked="true|false"
  android:state_enabled="true|false"
  android:state_activated="true|false"
  android:state_window_focused="true|false"
  />
</selector>

android:constantSize屬性表示StateListDrawable的固有大小是否不隨狀態(tài)的改變而改變,因?yàn)闋顟B(tài)的改變會(huì)導(dǎo)致切換到具體的Drawable,而不同狀態(tài)的Drawable可能大小不同。true表示固有大小保持不變。dither表示抖動(dòng)效果。android:variablePadding表示StateListDrawable的padding是否隨狀態(tài)的改變而改變,不建議開啟。

<item>

每個(gè)item都表示一種狀態(tài)下的Drawable信息。常見狀態(tài)如下:

android:state_pressed 按下狀態(tài)
android:state_focused 獲取焦點(diǎn)
android:state_selected 用戶選擇了View
android:state_checked 用戶選中了View,一般用于CheckBox這類在選中和非選中狀態(tài)之間切換的View
android:state_enabled View處于可用狀態(tài)

系統(tǒng)會(huì)根據(jù)View的狀態(tài)從selector中選擇對(duì)應(yīng)的item,按照從上到下的順序查找,直至查找到第一個(gè)匹配的item。一般默認(rèn)的item都應(yīng)該放在selector的最后一條并且不附帶任何狀態(tài),這樣當(dāng)上面的item都無(wú)法匹配View的當(dāng)前狀態(tài)時(shí),就會(huì)選擇默認(rèn)的item,因?yàn)槟J(rèn)的item不附帶狀態(tài),所以它可以匹配View的任何狀態(tài)。

5.<level-list/>

<level-list
 xmlns:android="http://schemas.android.com/apk/res/android" >
 <item
  android:drawable=""
  android:minLevel=""
  android:maxLevel="" />
</level-list>

示例代碼

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:drawable="@drawable/s1" android:minLevel="0" android:maxLevel="20"/>
 <item android:drawable="@drawable/s2" android:minLevel="21" android:maxLevel="40"/>
 <item android:drawable="@drawable/s3" android:minLevel="41" android:maxLevel="60"/>
 <item android:drawable="@drawable/s4" android:minLevel="61" android:maxLevel="100"/>
</level-list>
//id是level_list_img的ImageView用上面的level-list做背景
ImageView iv = (ImageView) findViewById(R.id.level_list_img); 
LevelListDrawable levelListDrawable = (LevelListDrawable) iv.getDrawable();
int level = ???; //業(yè)務(wù)邏輯得出一個(gè)level信息,比如當(dāng)前電量
levelListDrawable.setLevel(level); //根據(jù)得出的電量level信息顯示level-list中的相應(yīng)電量的圖片

6.<transition/>

<transition xmlns:android="http://schemas.android.com/apk/res/android" >
 <item
  android:drawable=""
  android:id=""
  android:left=""
  android:top=""
  android:right=""
  android:bottom="" />
</transition>

兩個(gè)Drawable之間的淡入淡出效果,屬性同前面的Drawable,示例代碼:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:drawable="@drawable/drawable1"/>
 <item android:drawable="@drawable/drawable2"/>
</transition>
//id是text_view的TextView用上面的transition做背景
TextView tv = (TextView) findViewById(R.id.text_view); 
TransitionDrawable drawable = (TransitionDrawable) tv.getDrawable();

drawable.startTransition(1000);
//drawable.reverseTransition(1000);//逆過(guò)程

7.<inset/>

<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable=""
 android:insetLeft=""
 android:insetTop=""
 android:insetRight=""
 android:insetBottom="" />

將其他drawable內(nèi)嵌到inset中,并且可以在四周留出一定的間距,屬性和前面的Drawable類似。下面的示例代碼實(shí)現(xiàn)了inset中的shape距離View的邊界為15dp,layer-list可以實(shí)現(xiàn)相同效果:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:insetBottom="15dp"
 android:insetLeft="15dp"
 android:insetRight="15dp"
 android:insetTop="15dp">

 <shape android:shape="rectangle">
  <solid android:color="#ff0000"/>
 </shape>
 
</inset>

8.<scale/>

<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable=""
 android:scaleGravity=""
 android:scaleHeight=""
 android:scaleWidth="" />

android:scaleGravity等同于shape中的android:gravity,android:scaleWidth和android:scaleHeight分別表示對(duì)指定drawable寬和高的縮放比例,以百分比的形式表示(看下面的示例代碼)。使用scale的時(shí)候需要考慮ScaleDrawable的level值,levle是0的時(shí)候表示ScaleDrawable不可見,0也是默認(rèn)值,所以要想ScaleDrawable可見,level等級(jí)不能是0。示例代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@drawable/test_drawable"
 android:scaleGravity="center"
 android:scaleHeight="70%"
 android:scaleWidth="70%" />
View view = findViewById(R.id.test_view);
ScaleDrawable drawable = (ScaleDrawable)view.getBackground();
drawable.setLevel(1);

代碼中必須設(shè)置level值,否則默認(rèn)值0是不可見的。level范圍系統(tǒng)內(nèi)部約定為0-10000,當(dāng)然設(shè)置成20000也能正常工作但不推薦那樣做。

9.<clip/>

<clip xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable=""
 android:clipOrientation=""
 android:gravity="" />

clipOrientation表示裁剪方向,有水平和豎直兩個(gè)方向。gravity和clipOrientation一起才能發(fā)揮作用,gravity的值如下:

含義
top 將內(nèi)部Drawable放在容器頂部,不改變它的大小。如果豎直裁剪,那么從底部開始裁剪
bottom 將內(nèi)部Drawable放在容器底部,不改變它的大小。如果豎直裁剪,那么從頂部開始裁剪
left 將內(nèi)部Drawable放在容器左邊,不改變它的大小。如果水平裁剪,那么從右邊開始裁剪
這是默認(rèn)值
right 將內(nèi)部Drawable放在容器右邊,不改變它的大小,如果水平裁剪,那么從左邊開始裁剪
center_vertical 將內(nèi)部Drawable在容器中豎直居中,不改變大小,如果豎直裁剪,那么從上下同時(shí)開始裁剪
fill_vertical 將內(nèi)部Drawable豎直方向填充容器。如果為豎直裁剪,那么僅當(dāng)ClipDrawable的等級(jí)為0時(shí)(0表示ClipDrawable被完全裁剪,即不可見),才能有裁剪行為
center_horizontal 類似center_vertical,方向不同
fill_horizontal 類似fill_vertical,方向不同
center 將內(nèi)部Drawable水平和豎直方向都居中,不改變大小。如果豎直裁剪,那么從上下同時(shí)裁剪,如果水平裁剪,那么從左右同時(shí)裁剪
fill 將內(nèi)部Drawable水平和豎直方向同時(shí)填充,僅當(dāng)ClipDrawable的等級(jí)為0時(shí),才有裁剪行為
clip_vertical 附加選項(xiàng),表示豎直方向裁剪,較少使用
clip_horizontal 附加選項(xiàng),表示水平方向裁剪,較少使用

Drawable等級(jí)是有范圍的,即0-10000,最小值0表示完全裁剪,即整個(gè)Drawable都不可見。最大值10000表示不裁剪。如果豎直方向從上向下裁剪,level值是8000表示裁剪了2000,即在頂部裁剪掉20%的區(qū)域,被裁剪的區(qū)域就相當(dāng)于不存在了。

三、Drawable的 level 總結(jié)

上面xml屬性介紹中有些drawable中l(wèi)evel是很重要的,這里總結(jié)一下:

  1. <level-list/> 中有多個(gè)item,每個(gè)item對(duì)應(yīng)一個(gè)drawable,通過(guò)設(shè)置具體的level值來(lái)決定使用哪個(gè)item即drawable。
  2. <scale/> 用于縮放,level默認(rèn)值是0,0表示ScaleDrawable不可見,所以要想ScaleDrawable可見,必須設(shè)置level不為0,具體是幾無(wú)所謂,不為0即可。
  3. <clip/> 表示裁剪,level值決定裁剪百分比,需要具體值,因?yàn)闆Q定裁剪百分比。

level值的范圍系統(tǒng)規(guī)定0-10000,設(shè)置level值的方法:

  1. 將相應(yīng)的Drawable設(shè)置成一個(gè)View的背景
  2. 從View的背景中取得相應(yīng)Drawable對(duì)象,代碼view.getDrawable() 或 view.getBackground(),強(qiáng)轉(zhuǎn)成相應(yīng)的Drawable類型即可
  3. 取得Drawable對(duì)象后調(diào)用setLevel()方法設(shè)置level。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論