Android APK開發(fā) Drawable文件夾下的自定義Drawable文件

  • Drawable的分類
  • 自定義Drawable
  • SVG矢量圖

個(gè)人總結(jié)的知識(shí)點(diǎn)外,部分知識(shí)點(diǎn)選自《Android開發(fā)藝術(shù)探索》-第六章 Drawable

1、Drawable是什么?

  1. 一種可以在Canvas上進(jìn)行繪制的抽象的概念
  2. 顏色、圖片等都可以是一個(gè)Drawable
  3. Drawable可以通過(guò)XML定義,或者通過(guò)代碼創(chuàng)建
  4. Android中Drawable是一個(gè)抽象類,每個(gè)具體的Drawable都是其子類

2、Drawable的優(yōu)點(diǎn)

  1. 使用簡(jiǎn)單,比自定義View成本低
  2. 非圖片類的Drawable所占空間小,能減小apk大小

3、Drawable的內(nèi)部寬/高

  1. 一般getIntrinsicWidth/Height能獲得內(nèi)部寬/高
  2. 圖片Drawable其內(nèi)部寬高就是圖片的寬高
  3. 顏色Drawable沒(méi)有內(nèi)部寬高的概念
  4. 內(nèi)部寬高不等同于它的大小,一般Drawable沒(méi)有大小概念(作為View背景時(shí),會(huì)被拉伸至View的大小)

Drawable的分類

4、BitmapDrawable的作用和使用

表示一種圖片,可以直接引用原始圖片或者通過(guò)XML進(jìn)行描述

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@color/colorPrimary"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:gravity="center"
    android:mipMap="false"
    android:tileMode="disabled"
    />

5、Bitmap的屬性

屬性 作用 備注
android:src 圖片資源ID
android:antialias 圖片抗鋸齒-圖片平滑,清晰度降低 應(yīng)該開啟
android:dither 開啟抖動(dòng)效果-用于高質(zhì)量圖片在低質(zhì)量屏幕上保存較好的顯示效果(不會(huì)失真) 應(yīng)該開啟
android:filter 開啟過(guò)濾-在圖片尺寸拉伸和壓縮時(shí)保持較好的顯示效果 應(yīng)該開啟
android:gravity 圖片小于容器尺寸時(shí),對(duì)圖片進(jìn)行定位-選項(xiàng)之間用‘ ’來(lái)組合使用
android:mipMap 紋理映射-圖像處理技術(shù) 默認(rèn)false
android:tileMode 平鋪模式-repeat單純重復(fù)、mirror鏡面反射、clamp圖片四周像素?cái)U(kuò)散 默認(rèn)disable關(guān)閉

6、gravity屬性詳情

可選項(xiàng) 含義
top/bottom/left/right 將圖片放在容器上/下/左/右,不改變圖片大小
center_vertical/horizontal 垂直居中/水平居中,不改變圖片大小
center 水平和垂直方向同時(shí)居中,不改變圖片大小
fill_vertical/horizontal 垂直/水平方向填充容器
fill 水平和垂直方向同時(shí)填充容器
clip_vertical/horizontal 垂直/水平方向的裁剪-較少使用

7、NinePatchDrawable(.9圖片)的作用

  1. 自動(dòng)根據(jù)寬高進(jìn)行縮放且不會(huì)失真
  2. 實(shí)際使用,可以直接引用圖片或者通過(guò)XML描述
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@color/colorPrimary"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:gravity="center"
    android:mipMap="false"
    android:tileMode="disabled"
    />

8、ShapeDrawable的作用

  1. 通過(guò)顏色構(gòu)造的圖形
  2. 可以是純色的圖形
  3. 也可以是有漸變效果的圖形
  4. shape標(biāo)簽創(chuàng)建的Drawable實(shí)體是GradientDrawable

9、ShapeDrawable的使用

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners
        android:radius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"/>
    <gradient
        android:angle="45"
        android:centerX="30"
        android:centerY="30"
        android:centerColor="@color/colorAccent"
        android:endColor="@color/colorPrimary"
        android:startColor="@color/colorPrimaryDark"
        android:gradientRadius="20"
        android:type="linear"
        android:useLevel="true" />
    <padding
        android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp" />
    <size
        android:width="200dp"
        android:height="200dp" />
    <solid
        android:color="@color/colorPrimary"/>
    <stroke
        android:width="10dp"
        android:color="@color/colorAccent"
        android:dashWidth="5dp"
        android:dashGap="3dp"/>

</shape>

10、ShapeDrawable的屬性介紹

屬性/標(biāo)簽 作用 備注
android:shape 圖形的形狀:rectangle矩形、oval橢圓、line橫線、ring圓環(huán) corners標(biāo)簽對(duì)應(yīng)于矩形;line和ring通過(guò)stroke指定線的寬度和顏色; ring圓環(huán)有五個(gè)特殊的shape屬性
corners標(biāo)簽 四個(gè)角的角度
gradient標(biāo)簽 漸變效果-android:angle表示漸變角度,必須為45的倍數(shù) android:type指明漸變類型:linear線性,radial徑向、sweep掃描
solid標(biāo)簽 純色填充 與gradient標(biāo)簽排斥
stroke標(biāo)簽 描邊 有描邊線和虛線
size標(biāo)簽 表示shape的固有大小,并非最終顯示的大小 沒(méi)有時(shí)getIntrinsicWidth返回-1;能指明Drawable的固有寬高,但如果作為View背景還是會(huì)被拉伸

11、LayerDrawable的作用

  1. XML標(biāo)簽為layer-list
  2. 層次化的Drawable合集
  3. 可以包含多個(gè)item,每個(gè)item表示一個(gè)Drawable
  4. item中可以通過(guò)android:drawable直接引用資源
  5. android:top等表示Drawable相當(dāng)于View上下左右的偏移量

12、LayerDrawable的使用(微信文本輸入框)

<?xml version="1.0" encoding="utf-8"?>
<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="6dp">
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFF"/>
        </shape>
    </item>

    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp">
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFF"/>
        </shape>
    </item>

</layer-list>

13、StateListDrawable的作用

  1. 對(duì)應(yīng)于selector標(biāo)簽
  2. 用于View根據(jù)狀態(tài)選擇不同的Drawable

14、StateListDrawable的使用和要點(diǎn)

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="false" //StateListDrawable的固有大小是否根據(jù)狀態(tài)而改變,默認(rèn)false=根據(jù)狀態(tài)而改變
    android:dither="true"        //是否開啟抖動(dòng)-讓高質(zhì)量圖片在低質(zhì)量屏幕上依舊效果好,默認(rèn)true開啟
    android:variablePadding="false" //padding是否根據(jù)狀態(tài)的改變而改變,不建議開啟(false)
    >
    <item android:state_pressed="true"  //Button被按下后卻沒(méi)有松開的狀態(tài)
        android:drawable="@color/colorAccent"/>
    <item android:state_focused="true"  //View獲取了焦點(diǎn)
        android:drawable="@color/colorPrimary"/>
    <item android:state_selected="true" //用戶選擇了View
        android:drawable="@color/colorPrimary"/>
    <item android:state_checked="true" //用戶選中了View,一般用于CheckBox這類在選中和沒(méi)有選中狀態(tài)之間切換的View
        android:drawable="@drawable/ic_launcher_background"/>
    <item android:state_enabled="true" //View處于可用狀態(tài)
        android:drawable="@drawable/ic_launcher_foreground"/>
    <item android:drawable="#FFFFFF"/> //默認(rèn)Drawable: 按順序向下匹配,需要放在最下方,因?yàn)榭梢云ヅ淙魏螤顟B(tài)
</selector>

15、LevelListDrawable的作用

  1. 對(duì)應(yīng)于level-list標(biāo)簽
  2. 擁有多個(gè)item,每個(gè)item都有maxLevelminLevel
  3. Level的范圍為0~10000
  4. 給定level后,會(huì)按從上至下的順序匹配,直到找到范圍合適的Drawable,并返回
  5. item的level一定要降序或者升序
  6. 調(diào)用View的getBackground獲得Drawable對(duì)象,并調(diào)用setLevel設(shè)置等級(jí)level
  7. ImageView的setImageLevel()能快速指定src引用的Drawable的Level
  8. LevelListDrawable是根據(jù)level改變,選擇不同的Drawable,能用于實(shí)現(xiàn)進(jìn)度條、音量調(diào)節(jié)等等

16、LevelListDrawable的使用

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:minLevel="0" android:maxLevel="10" android:drawable="@drawable/d1" />
    <item android:minLevel="11" android:maxLevel="20" android:drawable="@drawable/d2" />
    <item android:minLevel="21" android:maxLevel="30" android:drawable="@drawable/d3" />
    <item android:minLevel="31" android:maxLevel="40" android:drawable="@drawable/d4" />
</level-list>

17、TransitionDrawable的作用

  1. 對(duì)應(yīng)于transition標(biāo)簽
  2. 實(shí)現(xiàn)兩個(gè)Drawable之前的淡入淡出效果
  3. 獲得背景的TransitionDrawable后,通過(guò)startTransitionreverseTransition方法實(shí)現(xiàn)效果和逆過(guò)程

18、TransitionDrawable的使用

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/transition_drawable"
        android:drawable="@drawable/ic_launcher"
        android:top="10dp"    //四周的偏移量
        android:bottom="10dp"
        android:right="10dp"
        android:left="10dp"/>
    <item android:drawable="@drawable/ic_launcher_round" />
</transition>

19、InsetDrawable的作用和使用

  1. 對(duì)應(yīng)inset標(biāo)簽
  2. 將其他Drawable內(nèi)嵌到自身,并在四周留出間距
  3. View需要背景比自己實(shí)際區(qū)域要小的時(shí)候,可以使用insetlayer-list也可以實(shí)現(xiàn)該需求
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_launcher"
    android:insetTop="10dp"
    android:insetBottom="10dp"
    android:insetLeft="10dp"
    android:insetRight="10dp">
</inset>

20、ScaleDrawable的作用

  1. 對(duì)應(yīng)于scale標(biāo)簽
  2. 根據(jù)自己的等級(jí)level(0~10000)將指定的Drawable縮放到一定比例
  3. android:scaleHeight="70%"用于指定寬高的縮放比例=為原來(lái)的30%
  4. ScaleDrawable的level為0,不可見。為10000時(shí),不縮放。
  5. 一般將level設(shè)置為1,就會(huì)按照屬性指定的比例縮放。其他值也會(huì)改變縮放效果。
  6. android:scaleGravity屬性和gravity屬性完全一致

21、ScaleDrawable的使用

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_launcher"
    android:scaleGravity="center"
    android:scaleHeight="70%"
    android:scaleWidth="70%">
</scale>

22、ClipDrawable的作用

  1. 對(duì)應(yīng)于clip標(biāo)簽
  2. 根據(jù)自己當(dāng)前的等級(jí)level(0~10000)來(lái)裁剪另一個(gè)Drawable
  3. 裁剪方向由clipOrientationgravity屬性共同控制
  4. level為0,Drawable不可見;10000表示不裁剪;為8000,表示裁減了2000;為1,表示裁剪了9999

23、ClipDrawable的gravity

可選項(xiàng) 含義
top/bottom 將圖片放在容器上/下。若為垂直裁剪,從另一頭開始裁剪;若為水平裁剪,則從水平方向左/右兩頭開始裁剪
left/right 將圖片放在容器左/右。若為水平裁剪,從另一頭開始裁剪;若為垂直裁剪,則從垂直方向上/下兩頭開始裁剪
center_vertical/horizontal/center 垂直居中/水平居中/兩個(gè)方向均居中。效果只與clipOrientation有關(guān):水平裁剪,左右兩頭開始裁剪;垂直裁剪,上下兩頭開始裁剪
fill_vertical/horizontal 垂直/水平方向填充容器。gravity和orientation方向相同時(shí),不裁剪;方向不同時(shí),按照orientation的方向,從兩頭開始裁剪
fill 水平和垂直方向同時(shí)填充容器,沒(méi)有裁剪效果
clip_vertical/horizontal 效果類似center_center

24、AnimationDrawable的作用

  1. 對(duì)應(yīng)于animation-list標(biāo)簽
  2. 用于實(shí)現(xiàn)逐幀動(dòng)畫效果
  3. android:oneShot決定是循環(huán)播放還是播放一次,false:循環(huán)播放
  4. item中設(shè)置一幀一幀的Drawable以及持續(xù)時(shí)間
  5. AnimationDrawable的setOneShot(boolean flag)android:oneShot配置一樣
  6. addFrame (Drawable frame, int duration) 動(dòng)態(tài)的添加一個(gè)圖片進(jìn)入該動(dòng)畫中
  7. stop()和start()用于停止和開始/繼續(xù)播放,停止時(shí)會(huì)停留在當(dāng)前一幀上

25、AnimationDrawable的使用

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/shake_anim_01" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_02" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_03" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_04" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_05" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_06" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_07" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_08" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_09" android:duration="100"/>
    <item android:drawable="@drawable/shake_anim_10" android:duration="100"/>
</animation-list>
val imageview = findViewById<ImageView>(R.id.imaview)
(imageview.drawable as AnimationDrawable).start() //開始播放

27、ShapeDrawable的OvalShape、RectShape、ArcShape和PaintDrawable的作用和使用

  1. 用于獲得有shape形狀drawable(橢圓、長(zhǎng)方形、扇形以及更為通用PaintDrawable-具有圓角和邊界)
        /**===================================================
         *  一個(gè)繼承自ShapeDrawable更為通用的Drawable:具有圓角
         *====================================================*/
        PaintDrawable drawable3 = new PaintDrawable(Color.GREEN);
        drawable3.setCornerRadius(30);
        findViewById(R.id.textView3).setBackgroundDrawable(drawable3);

        /**============================================
         *   通過(guò)Shape構(gòu)造出相應(yīng)的ShapeDrawable
         *=============================================*/
        //橢圓形形狀 : shape賦予ShapeDrawable
        OvalShape ovalShape = new OvalShape();
        ShapeDrawable drawable1 = new ShapeDrawable(ovalShape);
        drawable1.getPaint().setColor(Color.BLUE);
        drawable1.getPaint().setStyle(Paint.Style.FILL);
        findViewById(R.id.textView1).setBackgroundDrawable(drawable1);

        //矩形形狀  : shape賦予ShapeDrawable
        RectShape rectShape = new RectShape();
        ShapeDrawable drawable2 = new ShapeDrawable(rectShape);
        drawable2.getPaint().setColor(Color.RED);
        drawable2.getPaint().setStyle(Paint.Style.FILL);
        findViewById(R.id.textView2).setBackgroundDrawable(drawable2);

        //扇形、扇面形狀 : shape賦予ShapeDrawable
        //順時(shí)針,開始角度30, 掃描的弧度跨度180
        ArcShape arcShape = new ArcShape(30, 180);
        ShapeDrawable drawable4 = new ShapeDrawable(arcShape);
        drawable4.getPaint().setColor(Color.YELLOW);
        drawable4.getPaint().setStyle(Paint.Style.FILL);
        findViewById(R.id.textView4).setBackgroundDrawable(drawable4);

26、其余Drawable及其功能

Drwable分類 xml標(biāo)簽 功能
ColorDrawable color 純色Drawable
RotateDrawable rotate 實(shí)現(xiàn)旋轉(zhuǎn)效果
RippleDrawable ripple 觸摸反饋動(dòng)畫,Andorid 5.0推出
VectorDrawable vector中使用path 【繪制靜態(tài)圖】使用矢量圖SVG, 能繪制一張圖就能適配不同分辨率, Android 5.0推出
AnimatedVectorDrawable animated-vector 【動(dòng)畫矢量圖】針對(duì)VectorDrawable來(lái)做動(dòng)畫, Android 5.0
AnimatedStateListDrawable animated-selector 【動(dòng)畫型StateListDrawable】在View狀態(tài)改變時(shí),展示動(dòng)畫

自定義Drawable

27、自定義Drawable

  1. 一般作為ImageView的圖像來(lái)顯示
  2. 另一個(gè)是作為View的背景
  3. 自定義Drawable主要就是實(shí)現(xiàn)draw方法
  4. setAlpha、setColorFiltergetOpacity也需要重寫,但是模板固定
  5. 當(dāng)自定義Drawable有固定大小時(shí)(比如繪制一張圖片),需要重寫getIntrinsicWidth()/getIntrinsicHeight()方法(默認(rèn)返回-1),會(huì)影響到Viewwrap_content布局
  6. 內(nèi)部固定大小不等于Drawable的實(shí)際區(qū)域大小,getBounds能獲得實(shí)際區(qū)域大小

28、自定義Drawable模板代碼

class CustomDrawable(color: Int) : Drawable(){
    var mPaint: Paint
    init {
        mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
        mPaint.color = color
    }
    override fun draw(canvas: Canvas) {
        val rect = bounds
        canvas.drawCircle(rect.exactCenterX(),
                rect.exactCenterY(),
                Math.min(rect.exactCenterX(), rect.exactCenterY()),
                mPaint)
    }

    override fun setAlpha(alpha: Int) {
        mPaint.alpha = alpha
        invalidateSelf()
    }
    override fun setColorFilter(colorFilter: ColorFilter?) {
        mPaint.colorFilter = colorFilter
        invalidateSelf()
    }
    override fun getOpacity(): Int {
        //not sure, so be safe
        return PixelFormat.TRANSLUCENT
    }
}

SVG矢量圖

29、SVG是什么?(Scalable Vetor Graphics)

  1. 可伸縮矢量圖(Android 5.0推出)
  2. 定義用于網(wǎng)絡(luò)的基于矢量的圖形(在Web上應(yīng)用非常廣泛)
  3. 使用XML格式定義圖形
  4. 圖像縮放不會(huì)影響質(zhì)量
  5. 萬(wàn)維網(wǎng)聯(lián)盟標(biāo)準(zhǔn)(與DOM和XSL之類的W3C標(biāo)準(zhǔn)是一個(gè)整體)

30、SVG和Bitmap區(qū)別

  1. SVG是一個(gè)繪圖標(biāo)準(zhǔn)。
  2. Bitmap是通過(guò)每個(gè)像素點(diǎn)上存儲(chǔ)色彩信息來(lái)表示圖像。
  3. SVG放大不會(huì)失真, Bitmap會(huì)失真。
  4. Bitmap需要為不同分辨率設(shè)計(jì)多套圖表,SVG繪制一張圖就能適配不同分辨率。

31、靜態(tài)矢量圖SVG-VectorDrawable

  1. 基于XML的靜態(tài)矢量圖
  2. 采用標(biāo)簽vector
  3. vectorpath是最小單位,創(chuàng)建SVG-用指令繪制SVG圖形
  4. vectorgroup將不同path組合起來(lái)

32、VectorDrawable的vector標(biāo)簽有哪些屬性

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="200dp"  // SVG的具體大小
    android:height="200dp"
    android:viewportWidth="100" //將寬度分為多少份,與path配合(50份等于100dp)
    android:viewportHeight="100">
    <group>   //將不同`path`組合起來(lái)
        <path    //SVG樹形結(jié)構(gòu)的最小單位,用指令繪制SVG圖形
            android:name="path1" //該path的名稱
            android:pathData="M 20,80 L 50,80 80,80"
            android:strokeColor="@color/colorAccent"
            android:strokeWidth="3"
            android:strokeLineCap="round"/>
        <path
            .../>
    </group>
</vector>

33、VectorDrawable的path標(biāo)簽的全部指令

指令 含義
M = moveto(M X, Y) 將畫筆移動(dòng)到指定的坐標(biāo)位置,但并未繪制
L = lineto(L X, Y) 畫直線到指定的坐標(biāo)位置
H = horizontal lineto(H X) 畫水平線到指定X坐標(biāo)位置
V = vertical lineto(V Y) 畫水平線到指定Y坐標(biāo)位置
C = curveto(C X1, Y1, X2, Y2, ENDX, ENDY) 三次貝賽曲線
S = smooth curveto(S X2, Y2, ENDX, ENDY) 三次貝賽曲線
Q = quadratic Belzier curve(Q X, Y, ENDX, ENDY) 二次貝賽曲線
T = smooth quadratic Belzier curveTO(T ENDX, ENDY) 映射前面路徑后的終點(diǎn)
A = elliptical Arc(A RX, RY, XROTATION, FLAG1, FLAG2, X, Y) 弧線(RX/RY:橢圓半軸大小 XROTATION:橢圓X軸與水平方向順時(shí)針?lè)较驃A角)
Z = closepath() 關(guān)閉路徑
  1. 坐標(biāo)軸以(0, 0)為中心, X軸水平向右, Y軸水平向下
  2. 指令大寫-絕對(duì)定位,參考全局坐標(biāo)系;指令小寫-相對(duì)定位,參考父容器坐標(biāo)系
  3. 指令和數(shù)據(jù)間空格可以省略
  4. 同一指令出現(xiàn)多次,可以只用一個(gè)。
  5. A的參數(shù):RX/RY:橢圓半軸大小 XROTATION:橢圓X軸與水平方向順時(shí)針?lè)较驃A角 FLAG1:1-大角度弧線 0-小角度弧線 FLAG2:起點(diǎn)到終點(diǎn)的方向,1-順時(shí)針,2-逆時(shí)針 X/Y:終點(diǎn)坐標(biāo)

34、VectorDrawable實(shí)例

//1. 使用`vector`標(biāo)簽定義矢量圖VectorDrawable(ic_black_24dp.xml)
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
        <group
           android:name="test"> //該組的名稱:可以在AnimatedVectorDrawable中指定動(dòng)畫效果
           <path
              android:fillColor="#FF000000"
              android:pathData="M12,6c1.11,0 2,-0.9 2,-2 0,-0.38 -0.1,-0.73 -0.29,-1.03L12,0l-1.71,2.97c-0.19,0.3 -0.29,0.65 -0.29,1.03 0,1.1 0.9,2 2,2zM16.6,15.99l-1.07,-1.07 -1.08,1.07c-1.3,1.3 -3.58,1.31 -4.89,0l-1.07,-1.07 -1.09,1.07C6.75,16.64 5.88,17 4.96,17c-0.73,0 -1.4,-0.23 -1.96,-0.61L3,21c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-4.61c-0.56,0.38 -1.23,0.61 -1.96,0.61 -0.92,0 -1.79,-0.36 -2.44,-1.01zM18,9h-5L13,7h-2v2L6,9c-1.66,0 -3,1.34 -3,3v1.54c0,1.08 0.88,1.96 1.96,1.96 0.52,0 1.02,-0.2 1.38,-0.57l2.14,-2.13 2.13,2.13c0.74,0.74 2.03,0.74 2.77,0l2.14,-2.13 2.13,2.13c0.37,0.37 0.86,0.57 1.38,0.57 1.08,0 1.96,-0.88 1.96,-1.96L20.99,12C21,10.34 19.66,9 18,9z"/>
        </group>
</vector>
//2. 使用矢量圖
<ImageView
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:src="@drawable/ic_black_24dp"/>

35、矢量圖動(dòng)畫-AnimatedVectorDrawable

  1. 針對(duì)靜態(tài)矢量圖-VectorDrawable來(lái)做動(dòng)畫
  2. xml標(biāo)簽為animated-vector
  3. target子標(biāo)簽下指明VectorDrawable的名字(都是android:name="..."屬性指明),并指定動(dòng)畫效果android:animation="@animator/..."

36、AnimatedVectorDrawable實(shí)例

//1. 靜態(tài)矢量圖-VectorDrawable(vector_two_line.xml)
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="200dp"
    android:height="200dp"
    android:viewportWidth="100"
    android:viewportHeight="100">
    <group>
        <path
            android:name="path1" //路徑1的名稱
            android:pathData="M 20,80 L 50,80 80,80"
            android:strokeColor="@color/colorAccent"
            android:strokeWidth="3"
            android:strokeLineCap="round"/>
        <path
            android:name="path2" //路徑2的名稱
            android:pathData="M 20,20 L 50,20 80,20"
            android:strokeColor="@color/colorAccent"
            android:strokeWidth="3"
            android:strokeLineCap="round"/>
    </group>
</vector>

//2. 軌跡動(dòng)畫效果-屬性動(dòng)畫ObjectAnimator(res/animator/trimpath_animator)
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="trimPathEnd"
    android:valueFrom="0"
    android:valueTo="1"
    android:valueType="floatType"
    android:interpolator="@android:interpolator/accelerate_decelerate">
</objectAnimator>

//3. 粘合靜態(tài)SVG和屬性動(dòng)畫:AnimatedVectorDrawable(vector_trimpath_anim.xml)
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vector_two_line"> //靜態(tài)SVG
   <target
       android:animation="@animator/trimpath_animator" //屬性動(dòng)畫
       android:name="path1"> //靜態(tài)SVG中路徑1的名稱
   </target>
   <target
       android:animation="@animator/trimpath_animator" //屬性動(dòng)畫
       android:name="path2"> //靜態(tài)SVG中路徑2的名稱
   </target>
</animated-vector>

//4. 布局中使用AnimatedVectorDrawable
<ImageView
            android:id="@+id/trimpath_anim_imageview"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:src="@drawable/vector_trimpath_anim"/> //動(dòng)畫矢量圖

代碼中開啟動(dòng)畫:

ImageView imageView = (ImageView) findViewById(R.id.trimpath_anim_imageview);
((Animatable)imageView.getDrawable()).start();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容