[Android] Folivora,在layout中直接建立drawable

爲何須要Folivora

對於android開發者來講,在layout文件中引用drawable來設置View的背景或者ImageViewsrc是很常見的事情,須要咱們在drawable文件夾下寫好xml文件就能夠應用了,可是有許多drawable文件可能只被使用了一次,也有可能咱們只是爲了實現一個簡單的圓角背景的功能。愈來愈多的drawable文件致使開發和維護成本的增長(還有強迫症),有沒有什麼方法能夠直接在layout文件中去建立drawable呢,Folivora爲你提供了這樣的功能。java

Folivora(樹懶), 形狀略似猴,動做遲緩,經常使用爪倒掛在樹枝上數小時不移動,故稱之爲樹懶。android

Folivora能作什麼

Folivora能夠爲你的View設置一個背景或者ImageView的src,當前支持的drawable類型有git

  • shape (GradientDrawable)
  • selector (StateListDrawable)
  • ripple (RippleDrawable)
  • layerlist (LayerListDrawable)
  • levellist (LevelListDrawable)
  • inset (InsetDrawable)
  • clip (ClipDrawable)
  • scale (ScaleDrawable)
  • animation (AnimationDrawable)

使用方法

只須要在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接口,用來建立一個替換RippleDrawableDrawable實例.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;
  }
}

複製代碼

更多可用的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提供了支持工具,按下面的方式使用:

  1. 下載jar包 點擊下載
  2. 拷貝下載的文件到Android Studio安裝目錄下的plugins/android/lib/下
  3. 重啓IDE,若是你的項目依賴中有Folivora,打開layout文件便可實時預覽

注: 支持工具依賴java的classloader加載類的順序(替換LayoutLibraryLoader和AndroidDomExtender),因此下載的jar包請不要重命名,直接拷貝便可

預覽效果

相關文章
相關標籤/搜索