public void flying() { PlayRunnable runnable = new PlayRunnable(); if (mMeasureH > 0 || mMeasureW > 0) { runnable.run(); } else { this.post(runnable); } }
public MagicFlyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); }
public static AbsAnimatorEvaluator create(int animType, int width, int heigh, Bitmap bitmap) { AbsAnimatorEvaluator evaluator = null; switch (animType) { case TYPE_B2T_SCATTER: evaluator = new B2TScatterEvaluator(width, heigh, bitmap); break; case TYPE_T2B_RAIN_NORMAL: evaluator = new T2BRainEvaluator(width, heigh, bitmap); break; default: evaluator = new B2TScatterEvaluator(width, heigh, bitmap); break; } return evaluator; } }
@Override public void run() { int randomIndex = new Random().nextInt(mBitmapList.size()); AbsAnimatorEvaluator evaluator = AnimatorCreater.create(mAnimatorType, mMeasureW, mMeasureH, mBitmapList.get(randomIndex)); ValueAnimator animator = ValueAnimator.ofObject(evaluator, evaluator.createAnimatorStart(), evaluator.createAnimatorEnd()); animator.setDuration(mFlyDuration); animator.setInterpolator(new AccelerateInterpolator()); MagicFlyLinearLayout.MagicAnimatorListener listener = new MagicFlyLinearLayout.MagicAnimatorListener(); animator.addUpdateListener(listener); animator.addListener(new MagicFlyLinearLayout.MagicListener(listener.hashCode())); animator.start(); } }
@Override public ValueState createAnimatorStart() { ValueState valueState = new ValueState(); valueState.bitmap = getBitmap(); valueState.alpha = 255; valueState.scale = 0.1f; valueState.pointF = new PointF(getMeasuredWith() / 2, getMeasuredHeigh() - getBitmap().getHeight() / 2); return valueState; }
@Override public ValueState createAnimatorEnd() { ValueState valueState = new ValueState(); valueState.bitmap = getBitmap(); valueState.alpha = 255; valueState.scale = 1f; valueState.pointF = new PointF(new Random().nextInt(getMeasuredWith()), getMeasuredHeigh()); return valueState; } }
public B2TScatterEvaluator(int width, int heigh, Bitmap bitmap) { super(width, heigh, bitmap); int realH = getMeasuredHeigh() - getBitmap().getHeight(); pointF1 = getBezierP01PointF(realH / 2, realH); pointF2 = getBezierP01PointF(0, realH / 2); }
public T2BRainEvaluator(int width, int heigh, Bitmap bitmap) { super(width, heigh, bitmap); int realH = getMeasuredHeigh() - getBitmap().getHeight(); pointF1 = getBezierP01PointF(0, realH / 2); pointF2 = getBezierP01PointF(realH / 2, realH); }
@Override public ValueState createAnimatorEnd() { ValueState valueState = new ValueState(); valueState.bitmap = getBitmap(); valueState.alpha = 0; valueState.scale = 1; valueState.pointF = new PointF(new Random().nextInt(getMeasuredWith()), 0); return valueState; } }
@Override public ValueState createAnimatorStart() { ValueState valueState = new ValueState(); valueState.bitmap = getBitmap(); valueState.alpha = 255; valueState.scale = 1f; valueState.pointF = new PointF(new Random().nextInt(getMeasuredWith()), -getBitmap().getHeight()); return valueState; }
private PointF getBezierP01PointF(int min, int max) { PointF pointF = new PointF(); pointF.x = new Random().nextInt(getMeasuredWith() - getBitmap().getWidth()); pointF.y = randomRange(min, max); return pointF; }
private PointF getBezierP01PointF(int min, int max) { PointF pointF = new PointF(); pointF.x = new Random().nextInt(getMeasuredWith() - getBitmap().getWidth()); pointF.y = randomRange(min, max); return pointF; }
@Override public ValueState evaluate(float fraction, ValueState startValue, ValueState endValue) { float timeStart = 1.0f - fraction; ValueState valueState = new ValueState(); PointF point = new PointF(); point.x = timeStart * timeStart * timeStart * (startValue.pointF.x) + 3 * timeStart * timeStart * fraction * (pointF1.x) + 3 * timeStart * fraction * fraction * (pointF2.x) + fraction * fraction * fraction * (endValue.pointF.x); point.y = timeStart * timeStart * timeStart * (startValue.pointF.y) + 3 * timeStart * timeStart * fraction * (pointF1.y) + 3 * timeStart * fraction * fraction * (pointF2.y) + fraction * fraction * fraction * (endValue.pointF.y); valueState.pointF = point; valueState.scale = 1; valueState.alpha = 255; valueState.bitmap = getBitmap(); return valueState; }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mMeasureH = this.getMeasuredHeight(); mMeasureW = this.getMeasuredWidth(); }
@Override public ValueState evaluate(float fraction, ValueState startValue, ValueState endValue) { float timeStart = 1.0f - fraction; ValueState valueState = new ValueState(); PointF point = new PointF(); point.x = timeStart * timeStart * timeStart * (startValue.pointF.x) + 3 * timeStart * timeStart * fraction * (pointF1.x) + 3 * timeStart * fraction * fraction * (pointF2.x) + fraction * fraction * fraction * (endValue.pointF.x); point.y = timeStart * timeStart * timeStart * (startValue.pointF.y) + 3 * timeStart * timeStart * fraction * (pointF1.y) + 3 * timeStart * fraction * fraction * (pointF2.y) + fraction * fraction * fraction * (endValue.pointF.y); valueState.pointF = point; valueState.scale = Math.abs((float)(1.0f - Math.pow((1.0f - fraction), 2 * 5))); valueState.alpha = (int) (timeStart * 255); valueState.bitmap = getBitmap(); return valueState; }
public void clearDrawable() { mBitmapList.clear(); postInvalidate(); }
public void addDrawable(int resId) { Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), resId); mBitmapList.add(bitmap); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFlyLinearLayout = (MagicFlyLinearLayout) this.findViewById(R.id.fly_layout); mFlyButton = (Button) this.findViewById(R.id.fly_btn); mFlyButton.setOnClickListener(this); mRainLinearLayout = (MagicFlyLinearLayout) this.findViewById(R.id.gift_layout); mRainButton = (Button) this.findViewById(R.id.gift_btn); mRainButton.setOnClickListener(this); mRainLinearLayout.addDrawable(R.drawable.fly0); mRainLinearLayout.addDrawable(R.drawable.fly1); mRainLinearLayout.addDrawable(R.drawable.fly2); mRainLinearLayout.addDrawable(R.drawable.fly3); mRainLinearLayout.addDrawable(R.drawable.fly4); mRainLinearLayout.addDrawable(R.drawable.fly5); mFlyLinearLayout.addDrawable(R.drawable.favourite_love_blue); mFlyLinearLayout.addDrawable(R.drawable.favourite_love_pink); mFlyLinearLayout.addDrawable(R.drawable.favourite_love_red); mFlyLinearLayout.addDrawable(R.drawable.favourite_love_yellow); }
@Override public void onAnimationUpdate(ValueAnimator animation) { mSparseArray.put(this.hashCode(), (ValueState) animation.getAnimatedValue()); postInvalidate(); } }