一、簡述
2020年4月4日這天幾乎大部分App和網(wǎng)站幾乎都變成了黑白顏色杨赤,舉國為疫情默哀敞斋,停止一切娛樂活動(dòng);
而作為一個(gè)技術(shù)人疾牲,有必要弄懂黑白效果的技術(shù)實(shí)現(xiàn)方案植捎;
回想過去是實(shí)現(xiàn)方案有:
1.替換全部布局或者活膚(實(shí)現(xiàn)成本過高);
2.圖片框架將所有圖片資源全部黑白處理(只能實(shí)現(xiàn)圖片資源的處理阳柔,局限性大)
最終想想焰枢,有沒有能一勞永逸的方法呢?既能不對(duì)代碼做過大的改動(dòng)盔沫,又能兼容app的業(yè)務(wù)不受改動(dòng)
答案是有的:
我們要從View布局開始入手医咨,去研究window View的繪制過程枫匾,然后找到突破點(diǎn)架诞。
二、利用Canvas實(shí)現(xiàn)黑白效果
使用ColorMartrix類中setSaturation調(diào)節(jié)飽和度干茉,然后設(shè)置到畫筆Paint中谴忧,使用畫筆在Canvas畫板實(shí)現(xiàn)黑白效果;
舉個(gè)例子:
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();
}
}
從這個(gè)例子可以知道,我們只需要通過自定義的View修改Canvas就能實(shí)現(xiàn)角虫,通過這種方式我們可以全局的去修改整個(gè)App的效果沾谓;
具體怎么實(shí)現(xiàn)呢?
通常項(xiàng)目中我們都會(huì)自定義BaseActiviy繼承AppCompatActivity重寫onCreate戳鹅, 獲取window 的DecorView根對(duì)象設(shè)置畫筆均驶;
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);
...
}
}
這里只是舉個(gè)例子,要實(shí)現(xiàn)的方式還有很多枫虏,只需要從頁面的根布局入手妇穴;