面试:Android页面改色方案
创始人
2024-03-07 19:43:14
0

介绍三种方案全局设置灰白模式,原理都是相同的,利用Android提供的ColorMatrix(颜色矩阵),将其饱和度设置为0,这样使用Paint绘制出来的都是没有饱和度的灰白样式!

不同的方案只是设置时机不同而已。

Android实现设置灰白模式效果 - 掘金

Android APP全局黑白化实现方案_xiaoerbuyu1233的博客-CSDN博客

最简单方案:监控activity生命周期,在onCreate中置灰

Application里面不是有registerActivityLifecycleCallbacks这个注册监听方法吗?监听里面的onActivityCreated不是可以获取到当前的Activity吗?那DecorView不就拿到了!

public class StudyApp extends Application {@Overridepublic void onCreate() {super.onCreate();Paint mPaint = new Paint();ColorMatrix mColorMatrix = new ColorMatrix();mColorMatrix.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {// 当Activity创建,我们拿到DecorView,使用Paint进行重绘View decorView = activity.getWindow().getDecorView();decorView.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);}....});}
}

方案一:给Activity的顶层View设置置灰,实现全局置灰效果

可以在BaseActivity的onCreate方法中,使用ColorMatrix设置灰度

    @Overrideprotected 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);}

方案二:该方法使用自定义layout,在dispatchdraw方法的时候,添加一层黑白色的bitmap,让界面开起来成为黑白模式。

先定义一个GrayFrameLayout布局


public class GrayFrameLayout extends FrameLayout {private Paint mPaint = new Paint();public GrayFrameLayout(@NonNull Context context) {super(context);}public GrayFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(cm));}@Overrideprotected void onDraw(Canvas canvas) {canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);super.onDraw(canvas);}@Overrideprotected void dispatchDraw(Canvas canvas) {canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);super.dispatchDraw(canvas);}
}

在BaseActivity的onCreateView方法中做如下处理:

 	@Overridepublic View onCreateView(View parent, String name, Context context, AttributeSet attrs {//方案二if("FrameLayout".equals(name)){int attributeCount = attrs.getAttributeCount();for (int i = 0; i < attributeCount; i++) {String attributeName = attrs.getAttributeName(i);String attributeValue = attrs.getAttributeValue(i);if(attributeName.equals("id")){int id = Integer.parseInt(attributeValue.substring(1));String resourceName = getResources().getResourceName(id);if("android:id/content".equals(resourceName)){GrayFrameLayout frameLayout  = new GrayFrameLayout(this,attrs);return frameLayout;}}}}return super.onCreateView(parent, name, context, attrs);}

方案三:有些特殊控件需要置灰,比如webview、H5页面、视频等

    //硬件加速置灰方法public void setLayerGrayType(View view) {if (mGrayMatrix == null || mGrayPaint == null) {init();}view.setLayerType(View.LAYER_TYPE_HARDWARE, mGrayPaint);}

特殊控件需要置灰的话直接调用setLayerGrayType()方法将view传进去,比如demo中让某个Activity置灰,那就在Activity里面调用:

GrayManager.getInstance().setLayerGrayType(getWindow().getDecorView());

相关内容

热门资讯

政策导航丨这些新举措加快全面绿... 总 监 制丨王列军 车海刚 监 制丨陈 波 王 彧 杨玉洋 主 编丨毛晶慧 编 辑丨陈姝含
韩媒:日本强征韩籍军人遗属首次... 参考消息网12月24日报道据韩联社12月23日报道,二战时期被日军强制征兵的韩籍遇难者遗属,23日针...
悬赏追捕2名台湾籍犯罪嫌疑人 威海公安今日发布悬赏通告:2025年6月,我局在对刘某某等7名“宏泰58号”大陆船员侦查过程中,发现...
穗东南石市社区居委会巧解噪音纠... “以前楼下广场舞音乐一响,孩子根本没法写作业,现在好了,居委会出面协调后,音量明显降下来了,邻里相处...
上海海关商品归类(税号)律师张... 海关法律师办案实务之商品归类(税号):漆皮皮革如何归类 2023年3月23日,当事人A公司委托B公...
推荐靠谱的拆迁律师,周蜜律师 在拆迁过程中,许多人都会面临各种各样的法律问题和权益纠纷,此时,一位靠谱的拆迁律师就显得尤为重要。在...
胶州李哥庄司法所开展“法律护航... 鲁网12月24日讯(记者 孙强)为了进一步预防校园欺凌事件的发生,加强青少年的法治意识和安全防范意识...
OpenAI、Anthropi... 钛媒体App 12月24日消息,包括普利策奖得主、记者约翰·卡雷鲁在内的多位作家在美国加利福尼亚北区...
中国高速传动坚称丰盛控股涉资金... 12月23日,中国高速传动(00658)发布公告,公告中提到公司正在积极应对与丰盛控股有限公司相关的...
日本拟推外国人入境前审查制度并... 日本政府据报计划建立审查制度,要求外国人在入境前要在网上接受审查,并考虑收取相关的审查手续费。共同社...