美文网首页
Android 黑白化界面

Android 黑白化界面

作者: 霁逸lei | 来源:发表于2022-12-19 17:34 被阅读0次

    Activity处理 相关链接App 黑白化实现探索,有一行代码实现的方案吗?鸿洋的博客-CSDN博客

    //根部局处理
    public class GrayFrameLayout extends FrameLayout {
        private Paint mPaint = new Paint();
    
        public GrayFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            ColorMatrix cm = new ColorMatrix();
            //设置饱和度0
            cm.setSaturation(0);
            mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
            super.dispatchDraw(canvas);
            canvas.restore();
        }
    
    
        @Override
        public void draw(Canvas canvas) {
            canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
            super.draw(canvas);
            canvas.restore();
        }
    
    }
     
    //Activity处理  重写onCreateView  这是全局方案,当前activity对应的界面都会黑白
    public class TestActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
        }
    
        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            try {
                if ("FrameLayout".equals(name)) {
                    int count = attrs.getAttributeCount();
                    for (int i = 0; i < count; i++) {
                        String attributeName = attrs.getAttributeName(i);
                        String attributeValue = attrs.getAttributeValue(i);
                        if (attributeName.equals("id")) {
                            int id = Integer.parseInt(attributeValue.substring(1));
                            String idVal = getResources().getResourceName(id);
                            if ("android:id/content".equals(idVal)) {
                                GrayFrameLayout grayFrameLayout = new GrayFrameLayout(context, attrs);
        //                            grayFrameLayout.setWindow(getWindow());
                                return grayFrameLayout;
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return super.onCreateView(name, context, attrs);
        }
    }
    

    状态栏颜色处理 单个颜色设置饱和度Android 颜色处理_-SOLO-的博客-CSDN博客

        /**
         * 设置饱和度 重新计算原颜色 置灰
         * @param normalColor
         * @return
         */
        public int getGrayColor(int normalColor){
            if (!grayActivityFlag){
                return normalColor;
            }
            ColorMatrix colorMatrix = new ColorMatrix();
            colorMatrix.setSaturation(0);
            float[] m = colorMatrix.getArray();
            int R = Color.red(normalColor);
            int G = Color.green(normalColor);
            int B = Color.blue(normalColor);
            int A = Color.alpha(normalColor);
            /**
             *  [ a, b, c, d, e,
             *    f, g, h, i, j,
             *    k, l, m, n, o,
             *    p, q, r, s, t ]
             *
             *    R = a*R + b*G + c*B + d*A + e;
             *   G = f*R + g*G + h*B + i*A + j;
             *   B= k*R + l*G + m*B + n*A + o;
             *   A = p*R + q*G + r*B + s*A + t
             */
            int nR = (int) (m[0] * R + m[1] * G + m[2] * B + m[3] * A + m[4]);
            int nG = (int) (m[5] * R + m[6] * G + m[7] * B + m[8] * A + m[9]);
            int nB = (int) (m[10] * R + m[11] * G + m[12] * B + m[13] * A + m[14]);
            int nA = (int) (m[15] * R + m[16] * G + m[17] * B + m[18] * A + m[19]);
            return Color.argb(nA,nR,nG,nB);
        }
    

    plan B 单独处理某个界面,如一个activity下的多个fragment只处理homeFragment

        /**
         * 0-设置黑白模式  1-恢复
         * @param activity
         * @param saturation A value of 0 maps the color to gray-scale. 1 is identity.
         */
        public void setGrayActivity(Activity activity,int saturation){
            int grayActivity = tdxApp.getInstance().getIntFrame(FRAME_GRAY_ACTIVITY, 0);
            grayActivityFlag = (grayActivity != 0);
            if (grayActivity == 0){
                return;
            }
            View decorView = activity.getWindow().getDecorView();
            Paint paint = new Paint();
            ColorMatrix cm = new ColorMatrix();
            cm.setSaturation(saturation);
            paint.setColorFilter(new ColorMatrixColorFilter(cm));
            decorView.setLayerType(View.LAYER_TYPE_HARDWARE,paint);
        }
    

    相关文章

      网友评论

          本文标题:Android 黑白化界面

          本文链接:https://www.haomeiwen.com/subject/uhdsfdtx.html