【问题标题】:Android Zipper Animation for unlock screen用于解锁屏幕的 Android 拉链动画
【发布时间】:2015-10-08 07:09:18
【问题描述】:

我目前正在制作 zip 动画来解锁 android 手机屏幕。更改背景图像是一项昂贵的任务,并且效果不流畅。我想要一个平滑的效果。请问有什么帮助吗?谢谢

【问题讨论】:

    标签: android animation zipper


    【解决方案1】:

    试试这个:

    平滑效果利用卷积矩阵:

    使用卷积矩阵更好地实现一些图像效果 方法如:高斯模糊、锐化、压纹、平滑……

    查看That Link以了解更多关于Convolution MatrixAnother one的信息

    做卷积矩阵

    import android.graphics.Bitmap;
    import android.graphics.Color;
    
    public class ConvolutionMatrix
    {
        public static final int SIZE = 3;
    
        public double[][] Matrix;
        public double Factor = 1;
        public double Offset = 1;
    
        public ConvolutionMatrix(int size) {
            Matrix = new double[size][size];
        }
    
        public void setAll(double value) {
            for (int x = 0; x < SIZE; ++x) {
                for (int y = 0; y < SIZE; ++y) {
                    Matrix[x][y] = value;
                }
            }
        }
    
        public void applyConfig(double[][] config) {
            for(int x = 0; x < SIZE; ++x) {
                for(int y = 0; y < SIZE; ++y) {
                    Matrix[x][y] = config[x][y];
                }
            }
        }
    
        public static Bitmap computeConvolution3x3(Bitmap src, ConvolutionMatrix matrix) {
            int width = src.getWidth();
            int height = src.getHeight();
            Bitmap result = Bitmap.createBitmap(width, height, src.getConfig());
    
            int A, R, G, B;
            int sumR, sumG, sumB;
            int[][] pixels = new int[SIZE][SIZE];
    
            for(int y = 0; y < height - 2; ++y) {
                for(int x = 0; x < width - 2; ++x) {
    
                    // get pixel matrix
                    for(int i = 0; i < SIZE; ++i) {
                        for(int j = 0; j < SIZE; ++j) {
                            pixels[i][j] = src.getPixel(x + i, y + j);
                        }
                    }
    
                    // get alpha of center pixel
                    A = Color.alpha(pixels[1][1]);
    
                    // init color sum
                    sumR = sumG = sumB = 0;
    
                    // get sum of RGB on matrix
                    for(int i = 0; i < SIZE; ++i) {
                        for(int j = 0; j < SIZE; ++j) {
                            sumR += (Color.red(pixels[i][j]) * matrix.Matrix[i][j]);
                            sumG += (Color.green(pixels[i][j]) * matrix.Matrix[i][j]);
                            sumB += (Color.blue(pixels[i][j]) * matrix.Matrix[i][j]);
                        }
                    }
    
                    // get final Red
                    R = (int)(sumR / matrix.Factor + matrix.Offset);
                    if(R < 0) { R = 0; }
                    else if(R > 255) { R = 255; }
    
                    // get final Green
                    G = (int)(sumG / matrix.Factor + matrix.Offset);
                    if(G < 0) { G = 0; }
                    else if(G > 255) { G = 255; }
    
                    // get final Blue
                    B = (int)(sumB / matrix.Factor + matrix.Offset);
                    if(B < 0) { B = 0; }
                    else if(B > 255) { B = 255; }
    
                    // apply new pixel
                    result.setPixel(x + 1, y + 1, Color.argb(A, R, G, B));
                }
            }
    
            // final image
            return result;
        }
    }
    

    然后做平滑效果

    public static Bitmap smooth(Bitmap src, double value) {
        ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
        convMatrix.setAll(1);
        convMatrix.Matrix[1][1] = value;
        convMatrix.Factor = value + 8;
        convMatrix.Offset = 1;
        return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
    }
    

    您可以根据需要更改值并获得平滑效果。

    那个教程找到了HERE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多