新年快乐,你们好,我又来了。。。
这篇文章主要是介绍我以前的一个框架BackgroundLibrary,预览功能的实现。
相信不少人看过我以前的文章: 无需自定义View,完全解放shape,selector吧 , 经过自定义标签去设置shape、selector的属性,省去了一大部分的shape.xml文件。
项目发布5个月,也累计了1500+的star,如今也基本稳定运行在各个项目中了。java
可是美中不足的是,虽然BackgroundLibrary这个库解决了繁琐的xml问题,确始终没法解决预览问题(下图所示),开发者只能直接在app中看到效果,没法在as中看到效果。这让咱们开发的时候形成了必定的不便。android
首先我想到了一个一样相似原理的框架Anko,经过动态生成布局来提升app性能,它实现预览的方式是经过实现一个自定义预览插件,而后须要预览的时候,每次build一下项目,而后进行预览,显然这种方式和咱们直接运行app没有太大的区别,并且开发插件的成本较高,不适合采用这种方法。git
那么as是如何实现view的预览的呢?
咱们简单看一下TextView的源码:github
一、若是须要对View进行预览,直接把原来的View换成框架内对应的BLView便可,便可展现预览效果,若是不须要预览能够直接忽略这些用于预览的自定义View;
二、若是没有效果,make project一下便可;
三、若是BLView中没有对应的须要预览的View,能够很简单的本身实现一下,以BLTextView为例:app
public class BLTextView extends AppCompatTextView {
public BLTextView(Context context) {
super(context);
}
public BLTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public BLTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs){
BackgroundFactory.setViewBackground(context, attrs, this);
}
}
复制代码
继承所须要预览的View,而后在构造函数中添加BackgroundFactory.setViewBackground(context, attrs, this)方法便可。
注意:
为了提升性能,这些View在编译的时候会自动替换为对应原生的View,因此除了再xml中,不要在代码中出现任何的BLTextView,不然会报相似以下的错误:框架
//错误
BLTextView button = findViewById(R.id.text);
//正确
BLTextView button = findViewById(R.id.text);
Caused by: java.lang.ClassCastException: android.support.v7.widget.AppCompatTextView cannot be cast to com.noober.background.view.BLTextView
复制代码
上面就是我实现思路的一个方式,只需一行代码setViewBackground去实现自定义View,来进行预览,而且在运行时替换自定义View,这样在开发的时候除了须要预览的状况,咱们彻底能够忽略这些自定义控件的存在,这对android sdk的升级改变都不会产生任何影响。欢迎你们提供更多的思路。函数