標籤雲

搜尋此網誌

2015/10/12

Material Design - 關於 Drawable 的新功能

Material Design 關於 Drawable 的部分有三個改進的地方
以下一一描述:

色彩遮罩(Tint)

Material Design 讓我們在 Android 5.0 (API level 21-) 之後可以對 bitmaps 跟 9-patches 使用色彩遮罩
適用的類別有 BitmapDrawable, NinePatchDrawable, VectorDrawable
對以上實體呼叫 setTint (int tintColor)
layout xml 屬性為 android:tint
(如果要清除 tint, 呼叫 setTintList(ColorStateList) 並傳入 null)

要使用的話最好也順便看一下
setTintMode(PorterDuff.Mode tintMode)
android:tintMode
的部分 (setTintMode 預設的 PorterDuff.Mode 是 SRC_IN)

從 Bitmap 中提取突出色 (prominent colors)

新增的 Palette 類別可以在 background thread 讀取 Bitmap 時透過 Palette.generate(Bitmap bitmap) 或 Palette.generate(Bitmap bitmap, int numColors) 在 Bitmap 中提取顏色
若不是在 background thread 可以用 Palette.generateAsync(Bitmap bitmap, Palette.PaletteAsyncListener listener)
及 Palette.generateAsync(Bitmap bitmap, int numColors, Palette.PaletteAsyncListener listener)
傳入 Palette.PaletteAsyncListener 來監聽

可以取得的顏色有以下幾種:
Vibrant, Vibrant dark, Vibrant light,
Muted, Muted dark, Muted light

不管是 Palette.generate 直接回傳的 Palette
還是 PaletteAsyncListener.onGenerated(Palette palette)傳回的
都可以透過如 Palette.getVibrantColor() 這樣的 method 取得 RGB 的 int 值了

記得要幫專案的 dependencies 設定加入 Palette 的 support lib
dependencies {
    compile 'com.android.support:palette-v7:21.0.0'
}

VectorDrawable
Android 5.0 (API level 21-) 之後可以透過 標籤的 XML 定義向量的 Drawable
稱之為 VectorDrawable

官方給了一個愛心形狀的範例如下:
<!-- res/drawable/heart.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    <!-- intrinsic size of the drawable -->
    android:height="256dp"
    android:width="256dp"
    <!-- size of the virtual canvas -->
    android:viewportWidth="32"
    android:viewportHeight="32">

  <!-- draw a path -->
  <path android:fillColor="#8fff"
      android:pathData="M20.5,9.5
                        c-1.955,0,-3.83,1.268,-4.5,3
                        c-0.67,-1.732,-2.547,-3,-4.5,-3
                        C8.957,9.5,7,11.432,7,14
                        c0,3.53,3.793,6.257,9,11.5
                        c5.207,-5.242,9,-7.97,9,-11.5
                        C25,11.432,23.043,9.5,20.5,9.5z" />
</vector>

至於 VectorDrawable 的動畫部分也一併在 Material Design 的動畫中說明吧

相關資料:
Working with Drawables
Drawable.setTint(int)
enum PorterDuff.Mode

VectorDrawable

W3C SVG PathData

沒有留言: