Android 常用动画之RotateAnimation
前两天接到任务做一个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
- <?xml version="1.0" encoding="utf-8"?>
- <rotate xmlns:android="http://schemas.android.com/apk/res/android" >
- <rotate
- android:fromDegrees="0"
- android:interpolator="@android:anim/linear_interpolator"//设置转动速率,这里设置的是匀速转动
- android:pivotX="50%"
- android:pivotY="50%"
- android:toDegrees="359"
- android:duration = "1500"
- android:repeatCount = "-1"
- android:drawable = "@drawable/ic_launcher"
- android:visible = "true">
- </rotate>
- </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,没什么特别的:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ImageView
- android:id="@+id/img"
- android:layout_centerInParent="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
MainActivity.java
- package com.example.rotateanimation;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.view.animation.LinearInterpolator;
- import android.widget.ImageView;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
- ((ImageView)findViewById(R.id.img)).setAnimation(rotate);
- ((ImageView)findViewById(R.id.img)).startAnimation(rotate);
- }
- }
这样,运行工程,一个旋转的Android小绿人就出现了。PS:不知道怎么制作动态图,效果展示不了。
在编写过程中有两个地方需要大家注意:
1、在rotate_anim.xml文件中,最外层的item名字要为rotate,而不是set。
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <rotate
- android:fromDegrees="0"
- android:interpolator="@android:anim/linear_interpolator"//设置转动速率,这里设置的是匀速转动
- android:pivotX="50%"
- android:pivotY="50%"
- android:toDegrees="359"
- android:duration = "1500"
- android:repeatCount = "-1"
- android:drawable = "@drawable/ic_launcher"
- android:visible = "true">
- </rotate>
- </set>
如果代码如上所示,是set的话,属性android:interpolator就会失效。具体原因我没有找到,有知道的朋友希望能在博文下方解惑,多谢。
这种情况下 需要在代码中设置动画的interpolator:
- Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
- LinearInterpolator lin = new LinearInterpolator();
- rotate.setInterpolator(lin);
- ((ImageView)findViewById(R.id.img)).setAnimation(rotate);
- ((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代码中:
这里面大部分参数已经在上面介绍过了,重点说下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
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ImageView
- android:id="@+id/img"
- android:layout_centerInParent="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_launcher"/>
- </RelativeLayout>
MainActivity.java
- package com.example.rotateanimation;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.view.animation.LinearInterpolator;
- import android.view.animation.RotateAnimation;
- import android.widget.ImageView;
- public class MainActivity extends Activity {
- private ImageView img;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- img = (ImageView) findViewById(R.id.img);
- //用xml实现
- /* Animation rotate = AnimationUtils.loadAnimation(this, R.drawable.rotate_anim);
- // LinearInterpolator lin = new LinearInterpolator();
- // rotate.setInterpolator(lin);
- img.setAnimation(rotate);
- img.startAnimation(rotate);*/
- //用Java code实现
- RotateAnimation rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- LinearInterpolator lin = new LinearInterpolator();
- rotate.setInterpolator(lin);
- rotate.setDuration(1500);//设置动画持续时间
- rotate.setRepeatCount(-1);//设置重复次数
- rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
- rotate.setStartOffset(10);//执行前的等待时间
- img.setAnimation(rotate);
- }
- }
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的更多相关文章
- Android 常用动画
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha :渐变透明度动画效果 scale :渐变尺寸伸缩 ...
- Android常用动画Frame-By-Frame Animations的使用
在Android的动画中有一种叫做Frame by Frame 的动画效果,就是跟Flash播放一样,是一帧一帧地显示,如果动画是连续并且有规律的话,就跟播放视频一样. 首先在drawable目录下添 ...
- Android常用动画alpha和rotate同时使用
Android的动画可以是一种动画,也可以多种动画作用于一张图片上,如RotaeAnimation和AlphaAnimation同时放到一个配置文件中 alpha1.xml <?xml vers ...
- Android常用动画Animation的使用
Andriod中有几种常用的Animation AlphaAnimation 淡入淡出效果 RotateAnimation 旋转效果 ScaleAnimation 缩放动画 TranslaAnima ...
- Android 常用动画小结
1. 渐入动画 // Request the next activity transition (here starting a new one). startActivity(new Intent( ...
- Android 动画之RotateAnimation应用详解
android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimat ...
- android 属性动画
一直再追郭霖的博客和imooc上的一些新的视频,最近有讲到属性动画. 以下内容为博客学习以及imooc上视频资料的学习笔记: 在3.0之前比较常见的动画为tween动画和frame动画: tween动 ...
- Android之动画
Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...
- 【Android开发日记】之基础篇(二)——Android的动画效果
什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干 ...
随机推荐
- 冒泡排序的C、C++实现
一.冒泡排序 冒泡排序就是重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如数字从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换, ...
- ajax调用后台webservice返回JSON字符
后台代码: [WebMethod] public static string LoginTest(string userCode, string password) { UserManageCente ...
- angular学习总结
因为学习需要,要配置一系列环境,中间又出了很多各种各样的花式错误,因此当做个人总结记录一下.一.vs1. 完全卸载VS2013找到vs2013的安装包,如图 打开cmd命令行窗口,cd到安装包下的vs ...
- 【模板】Kruskal
int n, m; struct Edge { int u, v, w; }a[MAX_M]; // 令a关于w升序排列 int r[MAX_N]; // 并查集 int Find(int x) { ...
- Apache Storm从一端读取实时数据的原始流
Apache Storm从一端读取实时数据的原始流,并将其传递通过一系列小处理单元,并在另一端输出处理/有用的信息. 下图描述了Apache Storm的核心概念. 640?wx_fmt=png&am ...
- 在c语言中嵌入汇编语句,对于我来说相当难。
今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言 ...
- postgresql常见命令及操作
pgsql已经更新到beta11了,不同版本的服务器启动或相关命令.配置可能会有不同,所以得根据pg版本进行操作.下面记录一些工作中常用到的一些操作,主要包括服务启动.备份/恢复数据.数据目录迁移.常 ...
- 织梦dedecms搜索页加上序列号autoindex
在我们做织梦搜索页模板的时候经常会使用到autoindex标签.那么怎么才能实现搜索页可以使用呢?下面给大家分享下解决方法: 打开文件:include/arc.searchview.class.php ...
- 使用pandas导入csv文件到MySQL
之前尝试过用命令行来解决csv文件导入到MySQL这个问题,没想到一直没有成功.之后会继续更新的吧,现在先用pandas来解决这个问题,虽然会复杂一点,但至少能用. 例子是导入movielens的ra ...
- python---django请求-响应的生命周期(FBV和CBV含义)
Django请求的生命周期是指:当用户在访问该url路径是,在服务器Django后台都发生了什么. 客户端发送Http请求给服务端,Http请求是一堆字符串,其内容是: 访问:http://crm.o ...