一、簡述
2020年4月4日這天幾乎大部分App和網(wǎng)站幾乎都變成了黑白顏色,舉國為疫情默哀,停止一切娛樂活動;
而作為一個技術(shù)人,有必要弄懂黑白效果的技術(shù)實現(xiàn)方案;
回想過去是實現(xiàn)方案有:
1.替換全部布局或者活膚(實現(xiàn)成本過高);
2.圖片框架將所有圖片資源全部黑白處理(只能實現(xiàn)圖片資源的處理,局限性大)
最終想想,有沒有能一勞永逸的方法呢?既能不對代碼做過大的改動,又能兼容app的業(yè)務不受改動
答案是有的:
我們要從View布局開始入手,去研究window View的繪制過程,然后找到突破點。
二、利用Canvas實現(xiàn)黑白效果
使用ColorMartrix類中setSaturation調(diào)節(jié)飽和度,然后設置到畫筆Paint中,使用畫筆在Canvas畫板實現(xiàn)黑白效果;
舉個例子:
public class CustomImageView extends AppCompatImageView {
private Paint mPaint = new Paint();
public CustomImageView(Context context, AttributeSet attrs) {
super(context, attrs);
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
}
@Override
public void draw(Canvas canvas) {
canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
super.draw(canvas);
canvas.restore();
}
}
從這個例子可以知道,我們只需要通過自定義的View修改Canvas就能實現(xiàn),通過這種方式我們可以全局的去修改整個App的效果;
具體怎么實現(xiàn)呢?
通常項目中我們都會自定義BaseActiviy繼承AppCompatActivity重寫onCreate, 獲取window 的DecorView根對象設置畫筆;
BaseActivity.java
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint);
...
}
}
這里只是舉個例子,要實現(xiàn)的方式還有很多,只需要從頁面的根布局入手;