[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包请不要重命名,直接拷贝便可

预览效果

相关文章
相关标签/搜索