博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
补间动画与帧动画简单笔记
阅读量:5764 次
发布时间:2019-06-18

本文共 6529 字,大约阅读时间需要 21 分钟。

###补间动画与帧动画:

  • 1、Animations
  • 2、Tween 首先来看看Tween动画
  • 1、Alpha:渐变透明度动画
  • 2、Scale:渐变尺寸伸缩动画
  • 3、Translate:画面转换位置移动动画
  • 4、Rotate:画面转移选择动画
这些动画的执行步奏差不多,先定义Animation动画对象,然后设置动画的一些属性,最后通过startAnimation()方法来开始动画			setDuration(long durationMillis)   设置动画显示的时间			startAnimation(Animation animation)   animation为要播放的动画							复制代码
  • 第一种:Alpha (1)通过xml来创建动画alpha_anim.xml 在res/anim目录下:
复制代码
(2)直接在程序中创建动画:复制代码
Animation alpha = new AlphaAnimation(0.1f,1.0f); 						alpha.setDuration(5000);						复制代码
  • 第二种:Sacle
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)复制代码
  • 功能:创建一个渐变尺寸伸缩动画
  • fromX,toX,分别是其实和结束时候x坐标上的伸缩尺寸,fromY,toY,分别是起始和结束的时候y坐标的伸缩尺寸
  • pivotXValue,pivotYValue 分别是伸缩动画相对于x,y坐标开始的位置,
  • pivotXType,pivotYType分别是x,y的伸缩模式
复制代码
  • 第三种:Translate
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 复制代码
* 创建一个移动画面位置的动画fromXDelta ,fromYDelta 起始坐标  toXDelta toYDelta 结束坐标复制代码
复制代码
  • 第四种:RotateAnimation
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)复制代码
* 参数;fromDegrees 为开始的角度,toDegrees为结束的角度  pivotXType   pivotYType 分别为x,y的伸缩模式 pivotXValue  pivotYValue 分别为伸缩动画相对于x,y坐标的开始位置复制代码
复制代码
  • 3、Frame

    frame动画起始就是逐帧动画,用法也比Tween动画简单,只需要创建一个AnimationDtawable对象来表示Frame动画,然后通过addFrame方法把没一帧要显示的内容加进去就行了,最后通过start方法就可以播放这个动画了,通过还可以使用setOneShort()方法来设置动画是否重复播放,在这里,还需要设置图片的所在位置 		首先在res/main目录下创建一个xml配置文件,用于存放图片资源的索引配置的是一个以
    根元素和
    子元素,如下复制代码
AnimationDrawable a = (AnimationDrawable) frameImage.getDrawable(); a.start(); //a.stop();复制代码
  • Android框架提供了两种动画系统:属性动画(3.0中引进)以及视图动画,总的来说,属性动画系统是最好的选择,因为他更加灵活,并提供了更多的特性

  • 属性动画系统是一个强大的框架,他允许你动画几乎所有的东西,例如一个对象在屏幕中的位置,要动画多久,和动画之间的距离

  • 通常我们要操作的属性为:

  • rotationX,rotationY 旋转

  • scaleX ,scaleY 缩放

  • translationX,translationY 平移

  • x,y 坐标

  • alpha 透明度

###ObjectAnimator:

//围绕x周旋转360度                ObjectAnimator.ofFloat(object_image,"rotationX",0.0f,360f).setDuration(500).start();               			   //组合多个动画			    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha",1f,0f,1f);                PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);                PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY",1f,0,1f);                ObjectAnimator.ofPropertyValuesHolder(object_image,pvhX,pvhY,pvhZ).setDuration(500).start();						ValueAnimator:				和ObjectAnimator用法类锁,		自由落体实例:		  DisplayMetrics dm = new DisplayMetrics();                getWindowManager().getDefaultDisplay().getMetrics(dm);                ValueAnimator anim = ValueAnimator.ofFloat(object_image.getY(),dm.heightPixels + object_image.getHeight()).setDuration(5000);                anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                    @Override                    public void onAnimationUpdate(ValueAnimator animation) {                        object_image.setTranslationY((Float) animation.getAnimatedValue());                    }                });                anim.start();				复制代码
  • 监听动画的事件:
  • 对于动画,一般都是一些辅助效果,比如我们要删除某个元素,我们可能希望是个淡出的效果,但是最终还要删掉,并不是你透明度没有了,还站着位置 所以我们需要知道动画如何结束
final View view = object_image;			 ObjectAnimator anim = ObjectAnimator.ofFloat(object_image,"alpha",1f,0f).setDuration(500);               anim.addListener(new Animator.AnimatorListener() {                    @Override                 public void onAnimationStart(Animator animation) {                    }                    @Override                  public void onAnimationEnd(Animator animation) {					 ViewGroup viewGroup = (ViewGroup) view.getParent();                       if (viewGroup != null){						//动画结束的时候删除                            viewGroup.removeView(object_image);                       }                   }                    @Override             public void onAnimationCancel(Animator animation) {                    }                    @Override             public void onAnimationRepeat(Animator animation) {                    }                });				anim.start();								或者				anim.addListener(new AnimatorListenerAdapter() {                    @Override               public void onAnimationEnd(Animator animation) {                        super.onAnimationEnd(animation);                        ViewGroup viewGropu = (ViewGroup) object_image.getParent();                        if (viewGropu != null){                            viewGropu.removeView(object_image);                        }                    }                });				anim.start(0;)								复制代码
  • 动画集合:
ObjectAnimator a1 = ObjectAnimator.ofFloat(object_image,"translationX",0f,200f);                ObjectAnimator a2 = ObjectAnimator.ofFloat(object_image,"translationY",0f,200f);                ObjectAnimator a3 = ObjectAnimator.ofFloat(object_image,"rotation",0.0f,360f,0f);                AnimatorSet set = new AnimatorSet();                set.setDuration(1000);                //set.playTogether(a1,a2,a3);  //三个动画同时执行                //set.playSequentially(a1,a2,a3);  //按序执行                //set.setStartDelay(300);  //延时执行                //a1,a2同时执行,之后a3                set.play(a1).with(a2);                set.play(a3).with(a2);                set.start();				复制代码
  • 注意:
animSet.play().with();也是支持链式编程的,但是:				animSet.play(anim1).widh(anim2).before(anim3).before(anim4);				这样是不行的,系统不会根据你写的这一长串决定先后顺序的				复制代码
  • 插值器(Interpolators)
例如:set.setInterpolator(new BounceInterpolator());		AccelerateDecelerateInterpolator  插补,其变化率慢慢开始和结束,但是通过中间加速		AccelerateInterpolator  插补  其变化率开始缓慢,然后加快		AnticipateInterpolator  内插的变化开始落后,然后向前甩		AnticipateOvershootInterpolator  内插的变化,开始落后,甩向前冲过目标值,然后终于可以追溯到最终值		BounceInterpolator 插补 其变化在最后反弹		CycleInterpolator  内插动画重复指定的周期数		DecelerateInterpolator 插补 其变化的速度开始很快,然后减速		LinearInterpolator  插补  其变化率是恒定的		OvershootInterpolator 内插的变化甩向前和冲过的最后一个值,然后回来		TimeInterpolator 一个接口,使您实现自己的插补				复制代码
  • 使用xml文件夹创建属性动画
首先在res下创建animator文件下,然后创建自己的文件	
复制代码
  • 多个动画组合
复制代码
  • 多个动画组合
Animator anim = AnimatorInflater.loadAnimator(this,R.animator.anim);            object_image.setPivotX(0);            object_image.setPivotY(0);            //显示的调用invalidate            object_image.invalidate();            anim.setTarget(object_image);            anim.start();			复制代码

转载地址:http://knwux.baihongyu.com/

你可能感兴趣的文章
多重影分身:一套代码如何生成多个小程序?
查看>>
Oracle将NetBeans交给了Apache基金会
查看>>
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
DLA实现跨地域、跨实例的多AnalyticDB读写访问
查看>>
实时编辑
查看>>
北漂之毕业裁员后的又一波奇遇
查看>>
Python数据分析:pandas常用函数
查看>>
KVO原理分析及使用进阶
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【JS基础】初谈JS现有的数据类型
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
Microsoft发布了Azure Bot Service和LUIS的GA版
查看>>
Google发布Puppeteer 1.0
查看>>
.NET开源现状
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
AMD改善Linux驱动,支持动态电源管理
查看>>