• 面试:Android页面改色方案


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

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

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

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

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

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

    1. public class StudyApp extends Application {
    2. @Override
    3. public void onCreate() {
    4. super.onCreate();
    5. Paint mPaint = new Paint();
    6. ColorMatrix mColorMatrix = new ColorMatrix();
    7. mColorMatrix.setSaturation(0);
    8. mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
    9. registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    10. @Override
    11. public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
    12. // 当Activity创建,我们拿到DecorView,使用Paint进行重绘
    13. View decorView = activity.getWindow().getDecorView();
    14. decorView.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);
    15. }
    16. ....
    17. });
    18. }
    19. }

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

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

    1. @Override
    2. protected void onCreate(@Nullable Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. //方案一
    5. Paint paint = new Paint();
    6. ColorMatrix cm = new ColorMatrix();
    7. cm.setSaturation(0);//灰度效果
    8. paint.setColorFilter(new ColorMatrixColorFilter(cm));
    9. getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint);
    10. }

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

    先定义一个GrayFrameLayout布局

    1. public class GrayFrameLayout extends FrameLayout {
    2. private Paint mPaint = new Paint();
    3. public GrayFrameLayout(@NonNull Context context) {
    4. super(context);
    5. }
    6. public GrayFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
    7. super(context, attrs);
    8. ColorMatrix cm = new ColorMatrix();
    9. cm.setSaturation(0);
    10. mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
    11. }
    12. @Override
    13. protected void onDraw(Canvas canvas) {
    14. canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
    15. super.onDraw(canvas);
    16. }
    17. @Override
    18. protected void dispatchDraw(Canvas canvas) {
    19. canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
    20. super.dispatchDraw(canvas);
    21. }
    22. }

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

    1. @Override
    2. public View onCreateView(View parent, String name, Context context, AttributeSet attrs {
    3. //方案二
    4. if("FrameLayout".equals(name)){
    5. int attributeCount = attrs.getAttributeCount();
    6. for (int i = 0; i < attributeCount; i++) {
    7. String attributeName = attrs.getAttributeName(i);
    8. String attributeValue = attrs.getAttributeValue(i);
    9. if(attributeName.equals("id")){
    10. int id = Integer.parseInt(attributeValue.substring(1));
    11. String resourceName = getResources().getResourceName(id);
    12. if("android:id/content".equals(resourceName)){
    13. GrayFrameLayout frameLayout = new GrayFrameLayout(this,attrs);
    14. return frameLayout;
    15. }
    16. }
    17. }
    18. }
    19. return super.onCreateView(parent, name, context, attrs);
    20. }

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

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

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

    GrayManager.getInstance().setLayerGrayType(getWindow().getDecorView());
  • 相关阅读:
    JVM 相关知识整理
    Java入门第106课——测试集合持有对象
    pdfH5实现pdf预览功能
    【C++】C++的类型转换
    Maven学习笔记(一)
    我要去长沙啦!1024程序员节活动征集!
    子组件跳转父组件
    springboot+基层慢性病信息管理系统 毕业设计-附源码221550
    数据挖掘实战(2):信用卡诈骗分析
    算法设计与分析双击调度自写
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/128137852