天天看點

Android Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

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>
           
Android Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

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>
           
Android Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

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>
           
Android Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

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>
           
Android Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

StateListDrawable點選

點選時,

Button

邊緣為紅色,預設和松開為藍色,一般預設會不加狀态,放在最後

  • android:constantSize

    StateListDrawable

    固有大小,是否随着狀态的改變而大小改變

常見的狀态

狀态 含義

android:state_pressed

按下的狀态

android:state_focused

View是否獲得焦點

android:state_selected

是否選擇了View

android:state_checked

是否選中,一般适用于CheckBox這些

android:state_enabled

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 Drawable知識學習1. Drawable2. Drawable的分類2.3 LayerDrawable3.最後

注‘Android技術交流群878873098,歡迎大家加入交流,暢談!本群有免費學習資料視訊且免費分享

作者:英勇青銅5

連結:https://www.jianshu.com/p/0d85e4d90e3c

來源:簡書