Android Drawable必備知識小結(jié)
什么是Drawable
首先Drawable是一個抽象類,表示的是可以在Canvas中繪制的圖像,常被用作一個view的背景,有多種實現(xiàn)類完成不同的功能。其次Drawable大致可以分為這幾類:圖片、由顏色構成的圖像。一般用xml中進行定義。
Drawable的繼承體系
Drawable的實現(xiàn)類及標簽
Drawable
內(nèi)部寬高的獲取
getIntrinsicHeight、getIntrinsicWidth
- 當Drawable由圖片構成時方法返回的是圖片的寬高
- 當Drawable由顏色構成時則沒有寬高的概念,返回-1
各類Drawable及其用法
BitmapDrawable
用于顯示一張圖片,如下示例
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:antialias="true" android:dither="true" android:filter="true" android:gravity="top" android:src="@mipmap/girl" android:tileMode="repeat" />
常用屬性
android:antialias 是否開啟抗鋸齒
android:dither 是否開啟防抖動
android:filter 是否開啟過濾效果
android:gravity 用于對圖片進行定位
android:src 圖片資源id
android:tileMode 平鋪模式,repeat、mirror、clamp三種
ColorDrawable
代表了單色可繪制區(qū)域,包裝了一種固定的顏色,在畫布上繪制一塊單色的區(qū)域。
示例:
<?xml version="1.0" encoding="utf-8"?> <color xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/colorAccent"> </color>
還可以用代碼創(chuàng)建
ColorDrawable drawable = new ColorDrawable(int color); //傳入一個color的integer值
NinePatchDrawable
即9-patch圖,可以根據(jù)內(nèi)容進行自由縮放寬高而不失真
示例:
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true" android:filter="true" android:src="@color/colorAccent"> </nine-patch>
用draw9patch設定縮放區(qū)域
圖中1、2方向表示在draw9patch中繪制黑線,黑線長度交集為可拉伸的范圍
圖中3、4方向黑線長度交集表示內(nèi)容可以填充的區(qū)域
ShapeDrawable
通過顏色來構造圖形,既可以為純色圖形,也可以為具有漸變效果的圖形。能構成的圖形有rectangle、oval、ring、line
具有漸變效果的圓示例:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <gradient android:angle="45" android:centerColor="@color/colorAccent" android:centerX="50%" android:centerY="50%" android:endColor="@color/colorPrimary" android:gradientRadius="150dp" android:startColor="@color/colorPrimaryDark" android:type="sweep" /> <size android:width="260dp" android:height="260dp" /> </shape>
注意:1、Android:angle值必須為45的倍數(shù) 2、oval用于繪制橢圓,當size的寬高相等時繪制成圓
圓環(huán)示例:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:innerRadius="100dp" android:shape="ring" android:thickness="10dp" android:useLevel="false" > <stroke android:width="10dp" android:color="@color/colorAccent" /> </shape>
注:
1、android:useLevel設置為false,否則無法顯示理想效果
2、innerRadius為圓環(huán)內(nèi)半徑,innerRadiusRation為內(nèi)半徑占圓環(huán)寬度的比率,兩者以innerRadius為主
3、thickness為圓環(huán)的寬度,thicknessRatio為此寬度占圓環(huán)寬度的比率,以thickness為主
常用屬性
- android:shape 要繪制的形狀,rectangle、oval、ring、line
- <stroke> 形狀的描邊,有如下屬性
- android:width 描邊的寬度
- android:color 描邊的顏色
- android:dashGap 繪制虛線的線寬
- android:dashWidth 繪制虛線的線段間隔 (要繪制虛線,后兩者均不能為0)
-<solid> 純色填充,android:color指定shape顏色
- <gradient> 漸變效果,與solid不可一起用,有如下屬性
- android:angle 漸變的角度,必須為45的倍數(shù)
- android:startColor 漸變的起始顏色
- android:centerColor 漸變的中間顏色
- android:endColor 漸變的結(jié)束顏色
- android:centerX 漸變的中心點橫坐標
- android:centerY 漸變的中心點縱坐標
- android:gradientRadius 漸變半徑
- android:type 漸變類型,linear(線性)、sweep(掃視)、radial(徑向)
- <corners> 表示矩形(rectangle)的四個角的角度,不適用于其他shape ,有如下屬性
- android:topLeftRadius、android:topRightRadius、android:bottomLeftRadius、android:bottomRightRadius 分別為設置左上角、右上角、左下角、右下角的角度
- android:radius 為四角設置相同角度,優(yōu)先級低,會被其他四個屬性覆蓋
- <size> shape的寬高,對應著android:width、android:height
- shape默認無寬高,getIntrinsicHeight、getIntrinsicWidth返回-1
- 通過size可以設置其寬高,但作為view背景時任然會被拉伸或縮小為 view大小
- <padding> 設置容納shape的view的空白間距
StateListDrawable
可以看作是一個狀態(tài)選擇器,通過view不同的狀態(tài)選擇對應的item中的drawable顯示
示例:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/colorPrimaryDark" android:state_pressed="false"></item> <item android:drawable="@color/colorAccent" android:state_pressed="true"></item> </selector>
常見狀態(tài)
android:state_pressed 當按住一個view時,按下的狀態(tài)
android:state_checked 當一個view被選中時,適用于CheckBox
android:state_selected 當一個view被選擇時
android:state_enabled 當一個view處于可用狀態(tài)
android:state_focused 當view獲取焦點
LayerDeawable
表示的是一種分層的的Drawable集合,類似于ps中的圖層的概念,將多個drawable放在不同的層上面形成一種疊加的效果
示例:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mipmap/night" /> <item android:drawable="@mipmap/photo6" android:gravity="center" /> </layer-list>
注意事項:
1、layer-list可以包含多個item,每個item表示一個drawable,并且后添加的item會覆蓋到之前添加的item上面
2、默認情況下,layer-list所有的drawable都會縮放至view大大小,通過設施android:gravity可以調(diào)節(jié)縮放的效果
3、可以設置上下左右偏移量,android:top、android:bottom、android:left、android:right
LevelListDrawable
表示一個drawable集合,集合中的每一個Drawable都有一個等級(level),通過設置不同的等級,可以使LevelListDrawable切換至不同的Drawable。等級范圍在0~10000之間, android:maxLevel設置最大level, android:minLevel設置最小level
示例:
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mipmap/photo0" android:maxLevel="20" android:minLevel="10" /> <item android:drawable="@mipmap/photo1" android:maxLevel="40" android:minLevel="30" /> </level-list>
通過設置level可切換不同的Drawable,在代碼中
//將ImageView的背景切換為photo1, 35 在30~40之間 iv.setImageLevel(35); //將ImageView的背景切換為photo0, 15在10~20之間 iv.setImageLevel(15);
TransitionDrawable
LayerDeawable的子類,用于實現(xiàn)連個Drawable的淡入淡出效果
示例:
xml文件定義
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mipmap/night" /> <item android:drawable="@mipmap/photo6" /> </transition>
給ImageView設置src,在java代碼中
iv= (ImageView) findViewById(R.id.iv_transition); drawable = (TransitionDrawable) iv.getDrawable(); drawable.startTransition(1000); // 實現(xiàn)淡入淡出效果 drawable.reverseTransition(1000);
InsetDrawable
嵌入其他Drawable,并可以在四周保留一定的間距
示例:
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@mipmap/photo6" android:inset="20dp"> </inset>
ScaleDrawable
根據(jù)等級將一個Drawable縮放到一定的比例,當level為0時不可見,當level為10000時無縮放效果
示例:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@mipmap/night" android:scaleGravity="center" android:scaleHeight="50%" android:scaleWidth="50%" />
要顯示出效果,必須設置level大于0
iv = (ImageView) findViewById(R.id.iv_scale); ScaleDrawable drawable= (ScaleDrawable) iv.getDrawable(); drawable.setLevel(1);
- android:scaleHeight="percentage",android:scaleWidth="percentage",設置寬高縮放為原來的比例為(100%-percentage)
- 設置level越大,圖像顯示越大
ClipDrawable
根據(jù)自己的等級(level)來對另一個Drawable進行裁剪,裁剪的方向由android:clipOrientation、android:gravity共同決定。設置level進行裁剪,level的大小從0到10000,level為0時完全不顯示,為10000時完全顯示
xml定義
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="horizontal" android:drawable="@mipmap/night" android:gravity="right"></clip>
<ImageView android:id="@+id/iv_clip" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/drawable_clip" />
通過設置level來裁剪
ImageView iv = (ImageView) findViewById(R.id.iv_clip); ClipDrawable drawable= (ClipDrawable) iv.getDrawable(); drawable.setLevel(5000); // 設置的level越大裁剪的范圍越小
屬性
android:clipOrientation ,horizontal 水平方向裁剪,vertical 垂直方向裁剪
android:gravity ,配合裁剪方向
自定義Drawable
自定義圓形Drawable
package com.yu.drawablelearing; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Shader; import android.graphics.drawable.Drawable; public class CircleDrawable extends Drawable{ private int radius; private int mWidth; private int mHeight; private Paint mPaint; @Override public void draw(Canvas canvas) { canvas.drawCircle(mWidth/2,mHeight/2,radius,mPaint); } public CircleDrawable(Bitmap bitmap) { radius = Math.min(bitmap.getWidth(), bitmap.getHeight())/2; mWidth = bitmap.getWidth(); mHeight = bitmap.getHeight(); BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint = new Paint(); mPaint.setShader(bitmapShader); mPaint.setAntiAlias(true); } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); invalidateSelf(); } @Override public void setColorFilter(ColorFilter colorFilter) { mPaint.setColorFilter(colorFilter); invalidateSelf(); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicHeight() { return mHeight; } @Override public int getIntrinsicWidth() { return mWidth; } }
自定義帶圓角的矩形Drawable
package com.yu.drawablelearing; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; /** * Created by pecu on 2016/08/24. */ public class RoundRectangleDrawable extends Drawable { private RectF rectF; private Paint mPaint; Bitmap mBitmap; @Override public void draw(Canvas canvas) { canvas.drawRoundRect(rectF, mBitmap.getWidth()/6,mBitmap.getHeight()/6, mPaint); } public RoundRectangleDrawable(Bitmap bitmap) { mBitmap = bitmap; mPaint = new Paint(); BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint.setAntiAlias(true); mPaint.setShader(bitmapShader); } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); invalidateSelf(); } @Override public void setColorFilter(ColorFilter colorFilter) { mPaint.setColorFilter(colorFilter); invalidateSelf(); } @Override public void setBounds(int left, int top, int right, int bottom) { super.setBounds(left, top, right, bottom); rectF = new RectF(left, top, right, bottom); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); } @Override public int getIntrinsicHeight() { return mBitmap.getHeight(); } }
自定義Drawable的一般步驟
1. 自定義Drawable類繼承自Drawable
2. 實現(xiàn)getOpacity,setColorFilter,setAlpha等方法
3. 在onDraw方法中進行繪制
4. 若自定義的Drawable有固定的大小,則需實現(xiàn)getIntrinsicWidth、getIntrinsicHeight方法
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android中一種巧妙的drawable.xml替代方案分享
- Android RippleDrawable 水波紋/漣漪效果的實現(xiàn)
- Android自定義Drawable之在Drawable中部指定透明區(qū)域方法示例
- 淺談Android中Drawable使用知識總結(jié)
- Android開發(fā)基于Drawable實現(xiàn)圓角矩形的方法
- Android自定義Drawable實現(xiàn)圓角效果
- Android Bitmap和Drawable的對比
- Android Drawable和Bitmap的轉(zhuǎn)換實例詳解
- Android DrawableTextView圖片文字居中顯示實例
- Android drawable微技巧,你不知道的drawable細節(jié)
相關文章
Android中TimePicker與DatePicker時間日期選擇組件的使用實例
這篇文章主要介紹了Android中TimePicker時間選擇與DatePicker日期選擇組件的使用實例,這兩個組件加上去的效果就是我們平時在iOS上設置鬧鐘時調(diào)整時間類似的滾動選項,需要的朋友可以參考下2016-04-04Android實現(xiàn)用代碼簡單安裝和卸載APK的方法
這篇文章主要介紹了Android實現(xiàn)用代碼簡單安裝和卸載APK的方法,涉及Android針對APK文件及package的相關操作技巧,需要的朋友可以參考下2016-08-08Android源碼學習之工廠方法模式應用及優(yōu)勢介紹
工廠方法模式定義:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類,感興趣的朋友可以了解下哦2013-01-01Android開發(fā)使用Handler實現(xiàn)圖片輪播功能示例
這篇文章主要介紹了Android開發(fā)使用Handler實現(xiàn)圖片輪播功能,涉及Android基于Handler操作圖片的相關實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2017-09-09activity全屏實現(xiàn)沉浸式效果,并且單獨觸摸不會彈出虛擬按鍵的方法
今天小編就為大家分享一篇activity全屏實現(xiàn)沉浸式效果,并且單獨觸摸不會彈出虛擬按鍵的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Android 使用AsyncTask實現(xiàn)多任務多線程斷點續(xù)傳下載
這篇文章主要介紹了Android 使用AsyncTask實現(xiàn)多任務多線程斷點續(xù)傳下載的相關資料,需要的朋友可以參考下2018-05-05Android 中RecyclerView頂部刷新實現(xiàn)詳解
這篇文章主要介紹了Android 中RecyclerView頂部刷新實現(xiàn)詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10