Android彩蛋效果,微信彩蛋效果

根据Android源码修改,具有微信彩蛋效果

主要代码

    public static class Board extends FrameLayout {

        public static final boolean FIXED_STARS = true;



        // 控制数量

        public static final int NUM_CATS = 30;



        static Random sRNG = new Random();



        static float lerp(float a, float b, float f) {

            return (b - a) * f + a;

        }



        static float randfrange(float a, float b) {

            return lerp(a, b, sRNG.nextFloat());

        }



        static int randsign() {

            return sRNG.nextBoolean() ? 1 : -1;

        }



        static <E> E pick(E[] array) {

            if (array.length == 0)

                return null;

            return array[sRNG.nextInt(array.length)];

        }



        public class FlyingCat extends ImageView {

            public static final float VMAX = 300.0f;



            public static final float VMIN = 100.0f;



            public float v, vr;



            public float dist;



            public float z;



            public ComponentName component;



            public FlyingCat(Context context, AttributeSet as) {

                super(context, as);

                setImageResource(R.drawable.star_anim);

            }



            public void reset() {

                final float scale = lerp(0.5f, 1.5f, z);

                setScaleX(scale);

                setScaleY(scale);

                // setX(-scale * getWidth() + 1);

                setX(randfrange(0, Board.this.getHeight() - scale * getHeight()));

                setY(randfrange(0, Board.this.getHeight() - scale * getHeight()));

                v = lerp(VMIN, VMAX, z);

                dist = 0;

            }



            public void update(float dt) {

                dist += v * dt;

                // setX(getX() + v * dt);

                // 根据Y轴漂移

                setY(getY() + v * dt);

            }

        }



        TimeAnimator mAnim;



        Context mContext;



        public Board(Context context, AttributeSet as) {

            super(context, as);

            this.mContext = context;

        }



        private void reset() {

            removeAllViews();

            final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(

                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

            for (int i = 0; i < NUM_CATS; i++) {

                FlyingCat nv = new FlyingCat(getContext(), null);

                addView(nv, wrap);

                nv.z = ((float) i / NUM_CATS);

                nv.z *= nv.z;

                nv.reset();

                nv.setX(randfrange(0, Board.this.getWidth()));

                final AnimationDrawable anim = (AnimationDrawable) nv.getDrawable();

                postDelayed(new Runnable() {

                    public void run() {

                        anim.start();

                    }

                }, (int) randfrange(0, 1000));

            }

            if (mAnim != null) {

                mAnim.cancel();

            }

            mAnim = new TimeAnimator();

            mAnim.setTimeListener(new TimeAnimator.TimeListener() {

                public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {

                    for (int i = 0; i < getChildCount(); i++) {

                        View v = getChildAt(i);

                        if (!(v instanceof FlyingCat))

                            continue;

                        FlyingCat nv = (FlyingCat) v;

                        nv.update(deltaTime / 200f);

                    }

                }

            });

        }



        @Override

        protected void onSizeChanged(int w, int h, int oldw, int oldh) {

            super.onSizeChanged(w, h, oldw, oldh);

            post(new Runnable() {

                public void run() {

                    reset();

                    mAnim.start();

                }

            });

        }



        @Override

        protected void onDetachedFromWindow() {

            super.onDetachedFromWindow();

            mAnim.cancel();

        }



        @Override

        public boolean isOpaque() {

            return true;

        }

    }

 少写了一行,源码下载地址:http://download.csdn.net/detail/zgz345/8247563

你可能感兴趣的:(android)