新年快樂,你們好,我又來了。。。
這篇文章主要是介紹我以前的一個框架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的升級改變都不會產生任何影響。歡迎你們提供更多的思路。函數