1. Drawable
Drawable
表示一種可以在
Canvas
上進行繪制抽象的概念,種類很多,最常見的顔色和圖檔都可以是一個
Drawable
。
Drawable
的優點:
- 使用簡單,比自定義
要簡單一些View
- 非圖檔類型的
占用空間小,對Drawable
的體積也會有點改善apk
Drawable
雖有很多種,但都表示一種圖像的概念,但又不僅僅都是圖檔,也可以通過顔色構造出各式各樣的圖像的效果。
Drawable
往往會被用作
View
的背景,一般是通過
xml
來定義,作為一個基類,
Drawable
有20多個子類
Drawable
的内部寬和高,通過
getIntrinsicWidth
和
getIntrinsicHeight
這兩個方法可以擷取,這兩個參數比較重要。但并不是所有的
Drawable
都有内部寬和高。圖檔形成的
Drawable
内部寬高就是圖檔的寬和高,一個顔色所形成的
Drawable
沒有寬和高。
注意:
Drawbale
的内部寬高并不等同于它的大小,一般來說,
Drawable
沒有大小的概念,當被用作
View
的背景時,
Drawable
會被拉伸至
View
的等同大小
2. Drawable的分類
分類有很多,但常用的也不是很多,使用也都不算難,在
xml
中指定屬性就可以實作一些看起來炫酷的效果
2.1 BitmapDrawable
使用蠻友善,隻需要在
xml
檔案中設定想要的屬性,在
activity
布局檔案
View
控件,使用
android:background
引用
簡單使用:
BitmapDrawable
的
bitmapdrawable.xml
檔案
注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:src="@drawable/ct"
android:dither="true"
android:filter="true"
android:gravity="center"
android:mipMap="false"
android:tileMode="mirror" />
MaintActivity
的布局檔案
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_main_activity"
android:background="@drawable/bitmapdrawable"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
BitmapDrawble
其中有個屬性
android:tileMode="mirror"
,最終的效果和
BitmapShader
的
TileMode.MIRROR
的鏡像效果感覺一樣
- android:antialas
是否開啟抗鋸齒。開啟後,圖檔變得平滑,但會降低一點點圖檔的清晰度
- android:dither
是否開啟圖像抖動。當圖檔的像素配置和手機螢幕的像素配置不一緻時,設定為
true
,高品質的圖檔在低像素的手機螢幕上也能比較好的顯示。
- android:filter
是否開啟過濾效果。當圖檔的尺寸被拉伸時,開啟過濾效果,可以保持較好的顯示比例效果
- android:mipMap
紋理映射。預設設定為
false
- android:tileMode
平鋪模式,有4個值。
disabled
,預設值,表示關閉平鋪模式。開啟平鋪效果後,
gravity
屬性會無效
repeat
,水準方向和豎直方向上的平鋪效果
mirror
,水準和豎直方向上鏡像
clamp
,圖檔四周的像素會被拉伸到整個區域
注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享
2.2 ShapeDrawable
通過顔色來構造圖形,可以為純色,也可以為漸變效果的圖形
簡單使用:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="@color/colorAccent" />
<gradient
android:angle="90"
android:centerColor="@android:color/white"
android:endColor="@android:color/holo_orange_light"
android:gradientRadius="10dp"
android:startColor="@color/colorAccent"
android:type="linear"
android:useLevel="false" />
<stroke
android:width="5dp"
android:color="@color/colorPrimary"
android:dashGap="1dp"
android:dashWidth="2dp" />
<size
android:width="200dp"
android:height="200dp" />
</shape>
ShapeDrawabe
- android:shape
指定圖形的形狀。
rectangle
矩形,
oval
橢圓,
line
線,
ring
圓環。
line
和
ring
需要
<stroke>
來指定線的寬度和顔色
<corners>
标簽
表示矩形
shape
的四個角,用來控制圓角的角度
- android:radius 同時為四個角設定圓角的角度,優先級低,會被其他的屬性覆寫
- android:topLeftRadius 左上角
- android:topRightRadius 右上角
- android:bottomLeftRadius 左下角
- android:bottomRightRadius 右下角
<solid>
标簽
純色填充,指定
shape
填充的顔色
<gradient>
标簽
與
<solid>
标簽互相排斥,表示漸變的效果
- android:angle 漸變的角度。預設為0,有效值必須為45°的倍數;0°表示從左到右,90°從下向上。有種順時針旋轉的感覺
- android:startColor 漸變起始顔色
- android:centerColor 漸變中間顔色
- android:endColor 漸變終止顔色
- android:type 漸變類型,
線性,linear
徑向漸變,radial
掃描sweep
- android:gradientRadius 漸變半徑
有效android:type= radial
- android:useLevel 一般為
,當false
作為Drawable
為StateListDrawable
true
- android:centerX 漸變中心點
坐标x
- android:centerY 漸變中心點
坐标y
<stroke>
标簽
Shape
的描邊
- android:width 描邊的厚度
- android:color 描邊的顔色
- android:dashWidth 組成虛線的線段長度,每個小線段的長度
- android:dashGap 虛線線段的間隔
<size>
标簽
shape
的大小,但并不是
shape
最終的顯示大小,
shape
會自适應
View
的寬高。
Drawable
的
getIntrinsicWidth()
和
getIntrinsicHeight()
方法,可以的帶
Drawable
的固定寬高,對于一些圖檔來說,固定的寬高就是圖檔的寬高。但對于
Shape
來說,預設沒有寬高,這兩個方法會傳回
-1
,若
<size>
标簽設定了,
Shape
也就有了固有寬高。但,作為
View
的背景時,
shape
還是會被拉伸或者壓縮到
View
的大小
<padding>
标簽
留白,作用于
View
,是
View
的留白
注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享
2.3 LayerDrawable
LayerDrawable
對應的
XML
标簽為
<layer-list>
,是一種階層化的
Drawable
集合通過不同層次的
Drawable
疊加而成的效果
簡單使用:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#0ac39e" />
</shape>
</item>
<item android:bottom="7dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
</shape>
</item>
<item
android:bottom="2dp"
android:left="2dp"
android:right="2dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
</shape>
</item>
</layer-list>
布局檔案:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<EditText
android:layout_width="match_parent"
android:layout_height="35dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/layerdrawable"
android:hint="請輸入"
android:padding="5dp"
android:textColorHint="@color/colorAccent" />
</RelativeLayout>
LayerDrawable
類似微信的輸入框,是用3層疊加出來的效果,也可以通過使用
Path
繪制
top,bottom,left,right
是相對于
View
的偏移量
2.4 StateListDrawable
對應于
<selector>
标簽,也是
Drawable
的集合,每個
Drawable
表示一種
View
的狀态
簡單使用:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 點選時 -->
<item android:state_pressed="true">
<shape>
<solid android:color="@android:color/white"/>
<stroke android:width="1dp" android:color="@color/colorAccent" />
<corners android:radius="4dp" />
</shape>
</item>
<!-- 松開時 -->
<item android:state_pressed="false">
<shape>
<solid android:color="@android:color/white"/>
<stroke android:width="1dp" android:color="@color/colorPrimary" />
<corners android:radius="4dp" />
</shape>
</item>
<!-- 預設 -->
<item >
<shape>
<solid android:color="@android:color/white"/>
<stroke android:width="1dp" android:color="@color/colorPrimary" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
StateListDrawable點選
點選時,
Button
邊緣為紅色,預設和松開為藍色,一般預設會不加狀态,放在最後
- android:constantSize
固有大小,是否随着狀态的改變而大小改變StateListDrawable
常見的狀态
狀态 | 含義 |
---|---|
| 按下的狀态 |
| View是否獲得焦點 |
| 是否選擇了View |
| 是否選中,一般适用于CheckBox這些 |
| View目前處于可用狀态 |
在
Material Design
中自帶的水波紋效果感覺很好看,可是,都推出這麼久了,并不是每個應用都遵循
注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享
2.5 TransitionDrawable
對應于
transition
标簽,可用于實作兩個
Drawable
之間的淡入淡出效果
簡單使用:
transitiondrawable.xml
檔案
<transition xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="translucent">
<item android:drawable="@color/colorAccent" />
<item android:drawable="@color/colorPrimary"/>
</transition>
MainActivity
代碼:
private void init() {
ImageView iv = (ImageView) findViewById(R.id.iv_main_activity);
TransitionDrawable transitionDrawable = (TransitionDrawable) ContextCompat.getDrawable(MainActivity.this,R.drawable.transitiondrawable);
iv.setImageDrawable(transitionDrawable);
transitionDrawable.startTransition(1000);
}
在
init()
方法中,
getResources().getDrawable(int id)
方法過時,就使用了
ContextCompat.getDrawable()
方法來替代
效果就是在
1
秒内,由紅色慢慢變成藍色
如果使用動畫,可能造成轉換效果生硬,尤其是圖檔顯示出來後,再開啟動畫,會造成圖檔閃爍的感覺
3.最後
個人認為的幾種常見的
Drawable
學習
本人很菜,有錯誤,請指出
話說,今天花大價錢買了兩本書,一本是
《深入了解計算機作業系統》
,也不曉得能不能看懂,哈哈
共勉 : )
注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享
作者:英勇青銅5
連結:https://www.jianshu.com/p/0d85e4d90e3c
來源:簡書