Android App全局黑白效果實現(xiàn)方案

一、簡述

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)的方式還有很多,只需要從頁面的根布局入手;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容