對於android開發者來講,在layout文件中引用drawable來設置View
的背景或者ImageView
的src
是很常見的事情,須要咱們在drawable文件夾下寫好xml文件就能夠應用了,可是有許多drawable文件可能只被使用了一次,也有可能咱們只是爲了實現一個簡單的圓角背景的功能。愈來愈多的drawable文件致使開發和維護成本的增長(還有強迫症),有沒有什麼方法能夠直接在layout文件中去建立drawable呢,Folivora爲你提供了這樣的功能。java
Folivora(樹懶), 形狀略似猴,動做遲緩,經常使用爪倒掛在樹枝上數小時不移動,故稱之爲樹懶。android
Folivora能夠爲你的View設置一個背景或者ImageView的src,當前支持的drawable類型有git
只須要在layout.xml中加入自定義的屬性, 告訴Folivora如何建立drawable就能夠了github
咱們來試着建立一個簡單的圓角效果:app
<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"/>
複製代碼
效果是這樣的ide
下面咱們來建立一個只有正常狀態和按下狀態的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"/>
複製代碼
顯示的效果是這樣的this
這樣的點擊效果太單調了,咱們來嘗試一下ripple漣漪效果:spa
<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
實例.code
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;
}
}
複製代碼
咱們在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);
}
}
複製代碼
dependencies {
implementation 'cn.cricin:folivora:0.0.2'
}
複製代碼
在Android Studio中提供了實時預覽編輯layout文件,可是IDE不識別自定義的屬性,預覽窗口渲染不出自定義的View背景,也沒法使用屬性提示
爲了解決這個問題,Folivora提供了支持工具,按下面的方式使用:
注: 支持工具依賴java的classloader加載類的順序(替換LayoutLibraryLoader和AndroidDomExtender),因此下載的jar包請不要重命名,直接拷貝便可
預覽效果