Android 给指定RelativeLayout添加雪花下落效果
来源:互联网 发布:安卓运行ubuntu 编辑:程序博客网 时间:2024/05/03 19:36
Overview
环境
- Android Studio
实现雪花下落效果
SnowController(context,rlty, drawables)
- 传入一个目标RelativeLayout
- 传入做动画的Drawable
- 实现步骤
- 创建项目
- 实现SnowController类
- 合入测试
效果图
实现SnowController
- 需要
- 目标Layout
- 动画图片
- 提供
- 动画监听
- 控制接口
- 实现
- 利用
ValueAnimator
计算动画数据 - 利用
ValueAnimator.AnimatorUpdateListener()
更新动画 - 利用
Animator.AnimatorListener()
监听动画,并回收对象 - 利用
Timer
和TimerTask
更新创建新的雪花
- 利用
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
- Android 给指定RelativeLayout添加雪花下落效果
- Android雪花下落效果
- Android 雪花飘落效果
- android雪花效果
- Android 水滴下落效果View
- Android 实现雪花飞舞效果
- 雪花下落+雪花颜色随机+形状随机
- Android-给照片底部添加波浪效果
- 雪花效果
- android实现漫天雪花&下雨效果
- Android动画-实现雪花飞舞动画效果
- 给地图自定义的大头针添加下降下落动画
- 给blog添加效果
- android SpannableString 使用详解(给文本添加效果)
- android给view比如layout等添加阴影效果
- android中动给组建添加动画载入效果
- Android wiki:02.给activity添加动画效果
- Android 给scrollView添加毛玻璃效果的标题栏
- 第三方框架SDWebImage学习
- Laravel大型项目系列教程(七)之7 扩展包和Artisan开发
- PowerBuilder基础知识
- ARC 下两种释放对象的方法
- UPnP基本原理以及在NAT中的应用
- Android 给指定RelativeLayout添加雪花下落效果
- listview dividerheight
- leetcode Remove Nth Node From End of List
- MySQL数据库备份命令
- Java系列笔记(3) - Java 内存区域和GC机制
- Android4.2锁屏流程【Android锁屏解析三】
- Android实现元素间的分割线 android:divider=""(3.0以上特性)支持3.0以下
- 转jstl的一些用法
- IAR修改工程名称的方法