根据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

05-11 10:50