Android 给指定RelativeLayout添加雪花下落效果

来源:互联网 发布:安卓运行ubuntu 编辑:程序博客网 时间:2024/05/03 19:36

Overview

  • 环境

    • Android Studio
  • 实现雪花下落效果SnowController(context,rlty, drawables)

    • 传入一个目标RelativeLayout
    • 传入做动画的Drawable
  • 实现步骤
    1. 创建项目
    2. 实现SnowController
    3. 合入测试

效果图

这里写图片描述


实现SnowController

  • 需要
    • 目标Layout
    • 动画图片
  • 提供
    • 动画监听
    • 控制接口
  • 实现
    • 利用ValueAnimator计算动画数据
    • 利用ValueAnimator.AnimatorUpdateListener()更新动画
    • 利用Animator.AnimatorListener()监听动画,并回收对象
    • 利用TimerTimerTask更新创建新的雪花

SnowController.java

public class SnowController {    private Context context;    private final static String  TAG = "SnowController";    private RelativeLayout mRootLayout;    private Rect mRootRect = new Rect();    private float mScale;    private ArrayList<Drawable> snowflakes = new ArrayList<>();    private static final int CREATE_SNOW = 0x001;    private int interval = 500; // 每次创建新雪花的间隔    private int duration = new Random().nextInt(3000) + 5000;    private Timer timer;    private TimerTask timerTask;    private boolean isSnowing = false;    private Handler snowHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            int whichSnowflake = new Random().nextInt(snowflakes.size());            Drawable drawable = snowflakes.get(whichSnowflake);            ImageView snow = new ImageView(context);            snow.setImageDrawable(drawable);            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);            params.setMargins(new Random().nextInt(mRootRect.width()), (int) (-128 * mScale),0,0);            params.width = (int) (128 * mScale);            params.height = (int) (128 * mScale);            mRootLayout.addView(snow,params);            startAnimation(snow);        }    };    public SnowController(Context context,RelativeLayout rootLayout,ArrayList<Drawable> drawables) {        this.context = context;        this.mRootLayout = rootLayout;        this.snowflakes = drawables;        init();    }    private void startAnimation(final View view){        view.setPivotX(view.getWidth());        view.setPivotY(view.getHeight());        int delay = new Random().nextInt(1000);        final ValueAnimator animator = ValueAnimator.ofFloat(0,1);        animator.setDuration(duration);        animator.setInterpolator(new AccelerateInterpolator());        animator.setStartDelay(delay);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            int x_move = new Random().nextInt(mRootRect.width());            int angle = new Random().nextInt(360) * (new Random().nextBoolean()? 1:-1);            @Override            public void onAnimationUpdate(ValueAnimator animation) {                float value = ((Float)animation.getAnimatedValue()).floatValue();                view.setRotation(angle * value);                view.setTranslationX((x_move-40)*value);                view.setTranslationY((mRootRect.bottom + (128 * mScale))*value);            }        });        animator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                Log.d("AnimatorListener","onAnimationStart");            }            @Override            public void onAnimationEnd(Animator animation) {                Log.d("AnimatorListener","onAnimationEnd");                ViewGroup viewGroup = (ViewGroup) view.getParent();                viewGroup.removeView(view);            }            @Override            public void onAnimationCancel(Animator animation) {                Log.d("AnimatorListener","onAnimationCancel");            }            @Override            public void onAnimationRepeat(Animator animation) {                Log.d("AnimatorListener","onAnimationRepeat");            }        });        animator.start();    }    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)    private void init(){        Display display = mRootLayout.getDisplay();        if (display != null){            mRootLayout.getDisplay().getRectSize(mRootRect);            DisplayMetrics metrics = new DisplayMetrics();            display.getMetrics(metrics);            mScale = metrics.density;            Log.d(TAG, mRootRect.toString()+" scale = "+ mScale);        }else {            //未能获取view区域        }    }    public void startSnow(){        if (timer == null || !isSnowing){            timer = new Timer();        }        if (timerTask == null || !isSnowing){            timerTask = new SnowTimerTask();        }        timer.schedule(timerTask,0,interval);        isSnowing = true;    }    public void stopSnow(){        isSnowing = false;        timer.cancel();    }    public void onDestory(){    }    public int getInterval() {        return interval;    }    public void setInterval(int interval) {        this.interval = interval;    }    public boolean isSnowing() {        return isSnowing;    }    private class SnowTimerTask extends TimerTask{        @Override        public void run() {            Log.d(TAG,"new snowflake is created");            snowHandler.sendEmptyMessage(CREATE_SNOW);        }    }}

使用方法

SnowController snowController = new SnowController(MainActivity.this,rootView, drawables);snowController.startSnow();
0 0
原创粉丝点击