Folivora,在layout中直接建立drawable
對於android開發者來說,在layout檔案中引用drawable來設定 View
的背景或者 ImageView
的 src
是很常見的事情,需要我們在drawable資料夾下寫好xml檔案就可以應用了,但是有許多drawable檔案可能只被使用了一次,也有可能我們只是為了實現一個簡單的圓角背景的功能。越來越多的drawable檔案導致開發和維護成本的增加(還有強迫症),有沒有什麼方法可以直接在layout檔案中去建立drawable呢,Folivora為你提供了這樣的功能。
Folivora(樹懶), 形狀略似猴,動作遲緩,常用爪倒掛在樹枝上數小時不移動,故稱之為樹懶。
Folivora能做什麼
Folivora可以為你的View設定一個背景或者ImageView的src,當前支援的drawable型別有
- shape (GradientDrawable)
- selector (StateListDrawable)
- ripple (RippleDrawable)
- layerlist (LayerListDrawable)
- levellist (LevelListDrawable)
- inset (InsetDrawable)
- clip (ClipDrawable)
- scale (ScaleDrawable)
- animation (AnimationDrawable)
使用方法
只需要在layout.xml中加入自定義的屬性, 告訴Folivora如何建立drawable就可以了
我們來試著建立一個簡單的圓角效果:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" android:text="shape1" app:drawableType="shape" app:shapeSolidColor="@android:color/holo_blue_light" app:shapeSolidCorner="5dp"/> 複製程式碼
效果是這樣的
下面我們來建立一個只有正常狀態和按下狀態的selector:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" android:text="selector" app:drawableType="selector" app:selectorStateNormal="@android:color/holo_blue_light" app:selectorStatePressed="@android:color/holo_blue_dark"/> 複製程式碼
顯示的效果是這樣的
這樣的點選效果太單調了,我們來嘗試一下ripple漣漪效果:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" android:text="ripple" app:drawableType="ripple" app:rippleColor="@android:color/white" app:rippleContent="@color/colorAccent"/> 複製程式碼
使用ripple的確是酷炫多了,但是ripple效果是5.0之後引入的,那5.0之前的裝置怎麼辦呢,Folivora為你提供了 RippleFallback
介面,用來建立一個替換 RippleDrawable
的 Drawable
例項.
Folivora.setRippleFallback(new RippleFallback()){ @Override public Drawable onFallback(ColorStateList ripple, Drawable content, Drawable mask, Context ctx){ StateListDrawable sld = new StateListDrawable(); sld.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(ripple.getDefaultColor())); sld.addState(new int[0], content); return sld; } } 複製程式碼
更多可用的drawable型別和相應屬性可以點 這裡 檢視
- 注入Folivora :
我們在layout檔案中設定了這些屬性之後,執行app是沒有任何效果的,View並不認識這些自定義的屬性,但是Folivora知道,所以想讓我們設定的屬性生效,我們需要在context中啟用Folivora,可以使用下面兩種方法:
public class MainActivity extends AppCompatActivity { @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(Folivora.wrap(newBase)); } } 複製程式碼
或者
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Folivra.installViewFactory(this); setContentView(R.layout.your_layout_xml_name); } } 複製程式碼
Gradle依賴
dependencies { implementation 'cn.cricin:folivora:0.0.2' } 複製程式碼
支援工具
在Android Studio中提供了實時預覽編輯layout檔案,但是IDE不識別自定義的屬性,預覽視窗渲染不出自定義的View背景,也無法使用屬性提示
為了解決這個問題,Folivora提供了支援工具,按下面的方式使用:
- 下載jar包點選下載。
- 拷貝下載的檔案到Android Studio安裝目錄下的plugins/android/lib/下
- 重啟IDE,如果你的專案依賴中有Folivora,開啟layout檔案即可實時預覽
注: 支援工具依賴java的classloader載入類的順序(替換LayoutLibraryLoader和AndroidDomExtender),所以下載的jar包請不要重新命名,直接拷貝即可
預覽效果