为了账号安全,请及时绑定邮箱和手机立即绑定

Android属性动画赏析

难度中级
时长 1小时20分
学习人数
综合评分9.80
125人评价 查看评价
9.9 内容实用
9.8 简洁易懂
9.7 逻辑清晰
  • 总结——常用属性 我们通过 ObjectAnimator 可以调用各种属性,只要这个属性具有get/set方法,我们就可以操纵它,如果这个属性没有提供get/set方法,或者我们想自定义一个属性,来让它进行一些改变,那么我们就要定义一个Property(属性),去实现它的set/get方法,就可以操作这样一个属性。 ObjectAnimator常用的一些操作属性: 1. translationX\translationY 2. rotation、rotationX\rotationY,这里的rotation是指3D的旋转。rotationX是水平方向的旋转,rotationY是垂直方向的旋转。 3. scaleX\scaleY 水平、垂直方向的缩放。 4. X\Y 具体会移动到的某个点。 5. alpha 透明度 属性动画框架执行的效率更高、效果更好。 总结——常用方法、类 1. ValueAnimator 数值发生器,可以实现很多很灵活的动画效果 2. ObjectAnimator 是ValueAnimator的一个子类,它封装了ValueAnimator,让我们更轻松地使用属性动画框架。我们通过ObjectAnimator来操作一个对象的属性,让对象产生一个动画效果。 3. AnimatorUpdateListener 监听事件 4. AnimatorListenerAdapter 监听事件 5. PropertyValuesHolder 控制动画集合的显示效果、顺序和流程控制 6. AnimatorSet 控制动画集合的显示效果、顺序和流程控制 7. TypeEvaluators 值计算器 8. Interpolators 插值器 值计算器和插值器用来控制具体产生的数值的一个变化规律以及变化状态。 总结——Interpolater图示(如图) 表格代表了所有值的变化范围,曲线代表产生的数值是如何变化的。这也就是插值器的概念。
    查看全部
  • 除了ValueAnimator.ofInt(),还有其他类型的数字生成器,其中ValueAnimator.ofObject()可以实现自定义的数字生成器。 参数中的fraction就是时间因子(0到1之间变化的数值)。通过fraction、startValue、endValue,通过各种各样的计算方式,就可以生成所有想要产生的值,不光能产生普通数据结构,通过泛型还可以定义更为复杂的数据结构。 ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator() { @Override public Object evaluate(float fraction, Object startValue, Object endValue) { return null; } }); 生成泛型PointF(float类型的点坐标): ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator<PointF>() { @Override public PointF evaluate(float fraction, PointF startValue, PointF endValue) { return null; } }); 在方法evaluate()中可以添加各种各样的计算方式。 ---------- 第二重境界学无止境,ValueAnimator不仅仅可以应用于动画,也可以应用于Android的其他领域。
    查看全部
  • 1. 之前学过ObjectAnimator是作用于某一控件的某一属性,而ValueAnimator本身不作用于任何属性,本身也不会提供任何动画,简单而言,ValueAnimator是一个数值发生器,可以产生任何你想要的数值,Android系统给它提供了很多数值计算方法。 2. 那么,产生这些数值有什么用呢?其实,在属性动画中,如何产生每一步的具体动画效果,都是通过 ValueAnimator 计算出来的。比如要实现一个0到100的位移动画,随着时间的持续,数值也从0到100递增,有这些值,就可以作用这些属性,让它产生动画效果。 3. 那么,ValueAnimator 是如何产生这些值的呢? 首先,ValueAnimator 会根据动画已经进行的时间和总时间的比值,产生一个0到1的时间因子,有了这样的时间因子,经过相应的变换,就可以根据你的StartValue和EndValue,来生成中间的相应的值。同时,通过插值器的使用,我们还可以进一步控制每一个时间因子的产生值的变化速度,比如我们使用线性插值器,生成数值的时候就是一个线性变化,只要时间相同,增量就相同。 由于 ValueAnimator 本身不响应任何一个动画,也不能控制任何一个属性,所以它并没有 ObjectAnimator 使用得那么广泛。 4. 查看源码,我们可以发现 ObjectAnimator 是继承了 ValueAnimator。之前也说过了,正是由于 ValueAnimator 产生的动画变化的变化值,ObjectAnimator 才可以将它应用于我们的属性。因此,ObjectAnimator 实际上是对ValueAnimator的封装。 5. 那么,如何通过 ValueAnimator 去实现动画效果呢?这就需要使用动画监听事件了,我们可以监听ValueAnimator每一步所产生的值,通过这个值去实现相应的动画效果。 案例:使用ValueAnimator实现计数器: 如图所示的例子中,先使用ValueAnimator.ofInt(0,100)获取0到100之间的所有数字,并设置一个时间为5秒,然后,通过监听器(调用addUpdateListener())的监听事件,获取 ValueAnimator每一步变化所产生的值,通过这些值去设置Button的显示文字。至此,就实现了一个简单的计数器。
    查看全部
  • 以下摘自评论区: (float) (Math.sin(Math.toRadians((i - 1) * 90 / (6 - 1))) * 200) 其中,6是要展开的图标数,200是半径。 按照上面程序加入translationX,和translationY中可以以扇形展开。 ------------ 案例中这个程序有一个bug,就是当动画还未完全展开的时候,此时再点击红色按钮,程序会响应回收图片的事件,由于图片还未完全展开,导致出现动画展开和回收一起出现的混乱场面。 ------------- 解决动画期间按钮可以点击的bug:在for循环外面增加ObjectAnimator的addListener的onAnimationEnd方法,在startAnim开始时设置按钮不可点击:mImageViews.get(0).setEnabled(false),在onAnimationEnd方法中恢复按钮点击事件:mImageViews.get(0).setEnabled(true),endAnim()同理。 --------------- 设置两个flag,第一个是记录菜单打开关闭的flag1,第二个是记录菜单是否处于动画中的flag2; 第二个记录处于动画中的flag2在进入for循环前改变状态成true; 第一个flag1 状态改变放在最后一个objectanimator的监听事件onAnimationEnd里,第二个flag2状态也在这里重新切换成false(因为到这里动画已经结束了) 放出菜单的判断是if(flag1&&!flag2) 放出收回菜单的判断是else if(!flag&&!flag2) 这样在动画中就不会再次触发动画了。
    查看全部
  • 如图是实现菜单弹出和回收的代码 其余代码: 全局变量: private int[] res={R.id.imageView_a,R.id.imageView_b,R.id.imageView_c,R.id.imageView_d, R.id.imageView_e,R.id.imageView_f,R.id.imageView_g,R.id.imageView_h,}; private List<ImageView> imageViewList = new ArrayList<ImageView>(); private boolean flag = true; 在 onCreate() 中进行ImageView初始化和点击事件的绑定: for (int i=0;i<res.length;i++){ ImageView imageView = (ImageView)findViewById(res[i]); imageView.setOnClickListener(this); imageViewList.add(imageView); } 在点击事件doClick()中对第一个图进行判断: switch (v.getId()){ case R.id.imageView_a: if(flag){ stratAnim(); }else { closeAnim(); } break; default: Toast.makeText(this, "点击了"+v.getId(), Toast.LENGTH_SHORT).show(); break } 这里列举了几种插值器(以下都只是前缀,例如Accelerate表示AccelerateInterpolator): Accelerate 加速变化 Decelerate 减速变化 AccelerateDecelerate 先加速再减速 Overshoot 在结束之前会超出预定位置一点点,然后回到预定位置 Bounce 最常见的回弹动画,例如自由落体的小球的回弹效果就是通过这样一个插值器实现的。
    查看全部
  • Animator 的 set 方法为我们提供了非常丰富的动画控制效果。例如:playTogether()同时播放,playSequentially()按顺序播放。 set还可以做更详细的顺序控制,如图 set.play(animator2).with(animator3); // 动画animator2和animator3同时进行 set.play(animator1).after(animator2); // 动画animator1在animator2(也可以写3)之后进行 这种方式也是属性动画框架中使用最多的一种:通过 ObjectAnimator 进行更精确的属性动画设置,只控制一个对象的一个属性,同时多个 ObjectAnimator 组合到 AnimatorSet 中,形成一个完整的动画效果。而且 AnimatorSet 可以通过调用 play()、with()、after()、before()、playTogether()、playSequentially()等方法,实现更为丰富的动画效果。
    查看全部
  • 在图中已经被注释掉的部分是使用 ObjectAnimator 的ofFloat()方法为 ImageView对象添加动画效果。 但这里更推荐使用图中的 PropertyValuesHolder 方式。因为谷歌在PropertyValuesHolder 中做了一些优化。 PropertyValuesHolder 的优点:更加有效率,更加节省系统资源。 ------------- 摘自评论区: ofFloat的常见参数:String[] values = {"translationX","translationY","scaleX","scaleY","rotation","alpha"}; translationX: 偏移位置(单位:像素) scalexX: 缩放程度(0.5F代表缩放50%) rotation: 旋转角度(单位:角度) alpha: 透明度(0.5F代码50%不透明)
    查看全部
  • 属性动画 Animator 与传统动画 Animation Animation:系统一直不断地调用 onDraw()方法去重绘界面,来实现动画的效果。 Animator:属性动画,顾名思义,就是通过属性的 get/set 方法去真实地改变这个属性。 既然已经有了 Animation 动画框架,谷歌为什么还要创建 Animator 属性动画框架呢? 局限性:交互性较差,比较耗费CPU资源等。举个例子: 给一个ImageView设置点击事件(比如弹出一个Toast),并给ImageView设置位移动画(动画已设置了setFillAfter(true),使图片在位移之后不会复位),最后设置一个Button用于启动动画。启动动画之前,我们点击图片,会弹出一个Toast,这很正常。但启动动画之后,等图片离开了原来的位置,我们再点击这个图片,却毫无响应,去点击原来的位置,却弹出了Toast,这就是Animation的第一个局限:它只是重绘了动画,并不具有交互性,不能做有交互的动画效果。 第二个局限:由于Animation动画框架是通过不断去调用 onDraw()去重绘界面,所以会很耗费CPU资源。 其他局限:Animation仅仅具有位移、旋转、缩放、透明度这4种动画。虽然通过各种各样的组合,我们已经能够实现比较丰富的动画效果,但是相比一个属性来说,这还是远远不够的。 -------------- 另外新手推荐学习 Google API Demos,这里汇集了很多Android经典的小例子。
    查看全部
  • 插值器总结
    查看全部
  • 属性动画总结
    查看全部
  • 属性动画常用属性
    查看全部
  • 006
    查看全部
  • ValueAnimator --数值发生器,可以实现很多很灵活的动画效果; ObjectAnimator --继承于ValueAnimator,可以很好滴使用属性对话框架; AnimatorUpdateListener -- 用于动画监听器 AnimatorListenerAdapter-- 用于动画监听器 PropertyValuesHolder --用于控制动画集合的显示效果 Animatorset --用于控制动画集合的显示效果 TypeEvaluators ---值计算器,用于控制值变化的规律 Interprolators ---插值计算器,用于控制值变化的规律
    查看全部
  • 005
    查看全部
  • 004
    查看全部

举报

0/150
提交
取消
老师告诉你能学到什么?
通过本课程,你将学到: 1、3.0之后新增的属性动画介绍 2、旧动画框架的局限性 3、实际演示属性动画的基本用法 4、介绍关于动画的高级技巧:插值器、估值器等 5、各种动画的使用场景

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!