谁有Android开机时文字动画效果源码,就是文字有闪电一般效果,划过一条直线
知道是两张图片叠加的,我需要源码

解决方案 »

  1.   


    public class MaskedTextView extends View {
     private Paint txtPaint;  
        /** 阴影渲染在X轴上的位移。 */  
        private float moveX = 0;  
        private boolean start = false;  
        /** 每次渲染的位移像素值。 */  
        private static final int MOVE_SPEEND = 1;  
        private void init() {  
            txtPaint = new Paint();  
            txtPaint.setColor(Color.GRAY);  
            txtPaint.setAntiAlias(true);  
            txtPaint.setTextSize(30);  
            // 创建一个线性梯度着色器  
            // 参数中colors的数组长度与positions的数组长度相对应<br/>  
            // 本例中初始化后相应的纯色位置如下(与平铺模式有关):<br/>  
            // Black: 200 * 0<br/>  
            // YELLOW: 200 * 0.3<br/>  
            // DKGRAY: 200 * 0.6<br/>  
            // WHITE: 200 * 1<br/>  
            // 最后一个参数为:着色器的颜色平铺模式。共有三种选择:<br/>  
            // 1.MIRROR: 颜色平铺从0→colors[i]→0,边缘过渡。  
            // 2.REPEAT: 颜色平铺从0→colors[i],边缘无过渡。  
            // 3.CLAMP:与边框着色有关。  
    //         Shader shader = new LinearGradient(0, 0, 200, 0, new int[] {  
    //                 Color.BLACK, Color.YELLOW, Color.DKGRAY, Color.WHITE },  
    //                 new float[] { 0, 0.3f, 0.6f, 1 }, Shader.TileMode.MIRROR);
            Shader shader = new LinearGradient(0, 0, 200, 0, new int[] {  
             Color.GRAY,Color.GRAY, Color.RED,Color.GRAY,Color.GRAY },  
                    new float[] {0.4f ,0.4f, 0.5f,0.6f,0.6f }, Shader.TileMode.MIRROR); 
            txtPaint.setShader(shader);  
        }  
        /** 由xml实例化的UI组件在VM中是调用本构造函数生成新实例的。 */  
        public MaskedTextView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
            init();  
        }  
        public void setStart(boolean start) {  
            this.start = start;  
            // 由UI主线程调用,开始渲染本UI组件。  
            invalidate();  
        }  
        protected void onDraw(Canvas canvas) {  
            moveX += MOVE_SPEEND;  
            Matrix matrix = new Matrix();  
            if (start) {  
                // 阴影渲染沿x轴向右移动dx像素,沿y轴向下移动0像素。  
                // 渲染的位移形成动画。  
                matrix.setTranslate(moveX, 0);  
                invalidate();  
            } else {  
                matrix.setTranslate(0, 0);  
            }  
            txtPaint.getShader().setLocalMatrix(matrix);  
            canvas.drawText(". . . . . . . . . . . . . . . . . . . . .", 0, 25, txtPaint);  
        }  
    }貌似不是图片叠加的吧? 就是一个view
      

  2.   

    可是我看网上说Android模拟器开机时文字闪动就是用两张图片叠加生成的,一个镂空,一个执行动画啊
    如果我想那么做应该怎么做呢?
      

  3.   

    源码是C++的,在bootanimation.cpp中,有个android函数,我贴出来,你自己看
    bool BootAnimation::android()
    {
        initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
        initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");    // clear screen
        glShadeModel(GL_FLAT);
        glDisable(GL_DITHER);
        glDisable(GL_SCISSOR_TEST);
        glClear(GL_COLOR_BUFFER_BIT);
        eglSwapBuffers(mDisplay, mSurface);    glEnable(GL_TEXTURE_2D);
        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);    const GLint xc = (mWidth  - mAndroid[0].w) / 2;
        const GLint yc = (mHeight - mAndroid[0].h) / 2;
        const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h);    // draw and update only what we need
        mFlingerSurface->setSwapRectangle(updateRect);    glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(),
                updateRect.height());    // Blend state
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);    const nsecs_t startTime = systemTime();
        do {
            nsecs_t now = systemTime();
            double time = now - startTime;
            float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w;
            GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w;
            GLint x = xc - offset;        glDisable(GL_SCISSOR_TEST);
            glClear(GL_COLOR_BUFFER_BIT);        glEnable(GL_SCISSOR_TEST);
            glDisable(GL_BLEND);
            glBindTexture(GL_TEXTURE_2D, mAndroid[1].name);
            glDrawTexiOES(x,                 yc, 0, mAndroid[1].w, mAndroid[1].h);
            glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h);        glEnable(GL_BLEND);
            glBindTexture(GL_TEXTURE_2D, mAndroid[0].name);
            glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h);        EGLBoolean res = eglSwapBuffers(mDisplay, mSurface);
            if (res == EGL_FALSE)
                break;        // 12fps: don't animate too fast to preserve CPU
            const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
            if (sleepTime > 0)
                usleep(sleepTime);
        } while (!exitPending());    glDeleteTextures(1, &mAndroid[0].name);
        glDeleteTextures(1, &mAndroid[1].name);
        return false;
    }