前两天接到任务做一个UI,有用到动画,于是抽空看了下Android动画相关知识。

Android Animation共有四大类型,分别是

Alpha      透明度动画

Scale      大小伸缩动画

Translate 位移动画

Rotate     旋转动画

这四类动画按模式又可分为:

tweened animation(渐变动画) —— alpha  与   scale

frame by frame(画面转换动画) ——  translate  与 rotate

讲一下我所了解到的rotate动画的各个属性:

在XML中:

 

官方给予的Rotate属性如上所示。

android:drawable    需要进行旋转动画的图片

android:fromDegrees  旋转的起始点(旋转开始的角度)

android:toDegrees     旋转的结束点(旋转最终角度)

andoird:pivotX       旋转点的X值(距离左侧的偏移量)

android:pivotY旋转点的Y值(距离顶部的偏移量)

android: visible这个好理解,就是图片初始的显示状态

我对这个的理解是:

rotate动画是以设置的旋转点(pivotX,pivotY)为坐标原点,顺时针方向从旋转起始角度(fromDegrees)到旋转最终角度(toDegrees)的动画,

其中旋转点默认为图片左上角是(0,0)。

现在写一个rotate动画的XML文件:rotate_anim.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <rotate
  4. android:fromDegrees="0"
  5. android:interpolator="@android:anim/linear_interpolator"//设置转动速率,这里设置的是匀速转动
  6. android:pivotX="50%"
  7. android:pivotY="50%"
  8. android:toDegrees="359"
  9. android:duration = "1500"
  10. android:repeatCount = "-1"
  11. android:drawable = "@drawable/ic_launcher"
  12. android:visible = "true">
  13. </rotate>
  14. </rotate>

这里需要注意下:

android:pivotX 与 android:pivotY 这两个属性值为float,可以给具体数也可以给百分比。比如你知道图片大小是100,你可以给(50,50)表示旋转中心点距图片左边50,右边50

如果不知道图片的准确大小,可以跟代码所示,给百分比。

上面的代码中还有一些在官方API中并未提及的属性,但是这些属性依旧可以使用到。


android:interpolator:这个属性是用来设置转动速率的。

LinearInterpolator为匀速效果,Accelerateinterpolator为加速效果、DecelerateInterpolator为减速效果,

android:repeatCount 重复的次数,默认为0,必须是int,可以为-1表示不停止

android:duration属性表示从android:fromDegrees转动到android:toDegrees所花费的时间,单位为毫秒。可以用来计算速度。

android:startOffset 在调用start函数之后等待开始运行的时间,单位为毫秒,若为10,表示10ms后开始运行

android:repeatMode 重复的模式,默认为restart,即重头开始重新运行,可以为reverse即从结束开始向前重新运行。

在android:repeatCount大于0或为infinite时生效

android:detachWallpaper 表示是否在壁纸上运行

android:zAdjustment 表示被animated的内容在运行时在z轴上的位置,默认为normal。normal保持内容当前的z轴顺序top运行时在最顶层显示bottom运行时在最底层显示


以上属性中,博主亲测,均可以正常使用。

布局文件 activity_main.xml,没什么特别的:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/img"
  7. android:layout_centerInParent="true"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"/>
  10. </RelativeLayout>

MainActivity.java

  1. package com.example.rotateanimation;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.animation.Animation;
  5. import android.view.animation.AnimationUtils;
  6. import android.view.animation.LinearInterpolator;
  7. import android.widget.ImageView;
  8. public class MainActivity extends Activity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
  14. ((ImageView)findViewById(R.id.img)).setAnimation(rotate);
  15. ((ImageView)findViewById(R.id.img)).startAnimation(rotate);
  16. }
  17. }

这样,运行工程,一个旋转的Android小绿人就出现了。PS:不知道怎么制作动态图,效果展示不了。

在编写过程中有两个地方需要大家注意:

1、在rotate_anim.xml文件中,最外层的item名字要为rotate,而不是set

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <rotate
  4. android:fromDegrees="0"
  5. android:interpolator="@android:anim/linear_interpolator"//设置转动速率,这里设置的是匀速转动
  6. android:pivotX="50%"
  7. android:pivotY="50%"
  8. android:toDegrees="359"
  9. android:duration = "1500"
  10. android:repeatCount = "-1"
  11. android:drawable = "@drawable/ic_launcher"
  12. android:visible = "true">
  13. </rotate>
  14. </set>

如果代码如上所示,是set的话,属性android:interpolator就会失效。具体原因我没有找到,有知道的朋友希望能在博文下方解惑,多谢。

这种情况下 需要在代码中设置动画的interpolator:

  1. Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
  2. LinearInterpolator lin = new LinearInterpolator();
  3. rotate.setInterpolator(lin);
  4. ((ImageView)findViewById(R.id.img)).setAnimation(rotate);
  5. ((ImageView)findViewById(R.id.img)).startAnimation(rotate);

2.我试过在布局文件中直接设置ImageView的src:android:src="@drawable/rotate_anim" 结果是图片会出现,但是不会旋转,所以不要这样做。

3. 如果ImageView本身就带图片了,那么rotate里面设置的drawable属性是无效的。会优先使用ImageView自身的图片

4.设置android:drawable属性的时候,不要忘了设置android:visible = "true",因为它默认是false(不可见)的。

在Java代码中:

RotateAnimation共有三个构造方法,这里详细讲述第三个,也就是参数最多的那个。
下面是Google官网中对于RotateAnimation的相关参数介绍:
 

这里面大部分参数已经在上面介绍过了,重点说下pivotXType与pivotYType

int pivotXType,  动画在X轴相对于物件位置类型,与下面的pivotXValue结合,确定X轴上旋转中心。

可能值为:Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_PARENT

如果pivotXType=Animation.ABSOLUTE,则此参数为旋转中心在屏幕上X轴的值;

如果pivotXType=Animation.RELATIVE_TO_PARENT,则参数pivotXValue为旋转中心在父控件水平位置百分比,如0.5表示在父控件水平方向中间位置;
如果pivotXType=Animation.RELATIVE_TO_SELF,则参数pivotXValue为旋转中心在控件自身水平位置百分比,如果X和Y的Value都设置为0.5,则该控件以自身中心旋转。

好了,贴代码: activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/img"
  7. android:layout_centerInParent="true"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/ic_launcher"/>
  11. </RelativeLayout>

MainActivity.java

  1. package com.example.rotateanimation;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.animation.Animation;
  5. import android.view.animation.AnimationUtils;
  6. import android.view.animation.LinearInterpolator;
  7. import android.view.animation.RotateAnimation;
  8. import android.widget.ImageView;
  9. public class MainActivity extends Activity {
  10. private ImageView img;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. img = (ImageView) findViewById(R.id.img);
  16. //用xml实现
  17. /*    Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
  18. //        LinearInterpolator lin = new LinearInterpolator();
  19. //        rotate.setInterpolator(lin);
  20. img.setAnimation(rotate);
  21. img.startAnimation(rotate);*/
  22. //用Java code实现
  23. RotateAnimation rotate  = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  24. LinearInterpolator lin = new LinearInterpolator();
  25. rotate.setInterpolator(lin);
  26. rotate.setDuration(1500);//设置动画持续时间
  27. rotate.setRepeatCount(-1);//设置重复次数
  28. rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
  29. rotate.setStartOffset(10);//执行前的等待时间
  30. img.setAnimation(rotate);
  31. }
  32. }

rotate里还有很多set属性的方法,跟XML中的属性一一对应,有兴趣的可以自己去尝试一下。

原创博文,转载请注明出处

以上就是RotateAnimation的内容,有不对的地方欢迎指正~

点击下载源码

参考文章:

1.http://my.oschina.net/ryanisme/blog/109674

2.http://www.android100.org/html/201304/24/2282.html

3.http://blog.csdn.net/jason0539/article/details/16370405

Android 常用动画之RotateAnimation的更多相关文章

  1. Android 常用动画

    一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha :渐变透明度动画效果 scale :渐变尺寸伸缩 ...

  2. Android常用动画Frame-By-Frame Animations的使用

    在Android的动画中有一种叫做Frame by Frame 的动画效果,就是跟Flash播放一样,是一帧一帧地显示,如果动画是连续并且有规律的话,就跟播放视频一样. 首先在drawable目录下添 ...

  3. Android常用动画alpha和rotate同时使用

    Android的动画可以是一种动画,也可以多种动画作用于一张图片上,如RotaeAnimation和AlphaAnimation同时放到一个配置文件中 alpha1.xml <?xml vers ...

  4. Android常用动画Animation的使用

    Andriod中有几种常用的Animation AlphaAnimation  淡入淡出效果 RotateAnimation 旋转效果 ScaleAnimation 缩放动画 TranslaAnima ...

  5. Android 常用动画小结

    1. 渐入动画 // Request the next activity transition (here starting a new one). startActivity(new Intent( ...

  6. Android 动画之RotateAnimation应用详解

    android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimat ...

  7. android 属性动画

    一直再追郭霖的博客和imooc上的一些新的视频,最近有讲到属性动画. 以下内容为博客学习以及imooc上视频资料的学习笔记: 在3.0之前比较常见的动画为tween动画和frame动画: tween动 ...

  8. Android之动画

    Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...

  9. 【Android开发日记】之基础篇(二)——Android的动画效果

          什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干 ...

随机推荐

  1. sql server获取当前月的天数

    方法1 SELECT 32-DAY(getdate()+32-DAY(getdate())) 方法2 CREATE FUNCTION dbo.fn_getMonthDayAll ---自定义函数名称 ...

  2. 洛谷P4234 最小差值生成树(LCT,生成树)

    洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最 ...

  3. 在Mac OS X上用Fluid把网页变成本地App

    最近一直在个在线听音乐的解决方案,也下了很多的本地软件,什么酷狗.酷我.豆瓣.虾米.QQ.百度音乐之类的,下了一大堆,都逐个测试了,效果都不是很理想-- 要么是UI太悲催,要么是对Retina支持不友 ...

  4. Spring Boot整合MyBatis(使用Spring Tool Suite工具)

    1. 创建Spring Boot项目 通过Spring Tool Suite的Spring Starter Project对话框,其实是把项目生成的工作委托http://start.spring.io ...

  5. Mac 删除应用卸载后无法正常移除的图标

    经常会不通过appstore下载软件,也就是从网页中下载dmg,自己安装,但是当我不再想要这个软件,然后把它卸载掉之后就会发现,launchpad里还是遗留了这个软件的图标,而且删不掉.这个时候,就可 ...

  6. Redis的持久化数据

    Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF:持久化记录服务器执行的 ...

  7. [应用篇]第六篇 JSTL之自定义函数标签库

      在之前的JSTL的总结中已经对函数标签库进行了一些说明,在这里我再一次重新整理一下! 自带函数标签库介绍 引入该标签库的方法为: <%@ taglib prefix="fn&quo ...

  8. Swift学习笔记1

    1.Swift 的String类型是值类型. 如果您创建了一个新的字符串,那么当其进行常量.变量赋值操作,或在函数/方法中传递时,会进行值拷贝. 任何情况下,都会对已有字符串值创建新副本,并对该新副本 ...

  9. vue之props父子组件之间的谈话

    眨眼就来杭州两年了,时间真快. 我们今天来说说vue的一个api---->props 首先我们先看看一个例子,是我一个项目中写的. 看到这个:有木有一点懂了.要是没懂,继续往下看 这里我们用到了 ...

  10. Linux ------清除内存中的cache

    首先以Centos6.4的来说,Centos7有些区别 一.buffer/cache/swap的介绍 #cat /etc/redhat-release  #查看系统版本 CentOS release ...