文档章节

android动画入门

abcijkxyz
 abcijkxyz
发布于 2016/07/30 17:24
字数 1093
阅读 1
收藏 0
    android动画有四种:Frame(逐帧)动画,Tween(补间)动画,Layout(布局)动画,Property(属性)动画。Frame动画跟放电影一样,依次播放静态图片。补间动画就是开发只需要指定开始,结束的关键帧,而动画变化的“中间帧”由系统计算并补齐。布局动画是在每次布局发生变化的时候系统调用的一个预加载动画效果,使用layout动画可以让布局的变化过度看起来更自然(不常使用)。属性动画,这个是在Android 3.0中才引进的,它可以直接更改我们对象的属性。本文只介绍前面两种,后面两种以后再写博文单独介绍。
    逐帧动画
    定义如下(在anim目录下定义一个xml文件):
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/flower1" android:duration="1000"/>
    <item android:drawable="@drawable/flower2" android:duration="1000" />
</animation-list>

    android:oneshot控制动画是否重复播放,如果为true就不重复。    

具体用法如下:    

1、在xml布局中设置ImageView的背景为动画(anim/xx.xml) 或者用代码:myView.setBackgroundResource(+R.anim.xx);(注意R前面的"+"号,如果没有可能会报错)    

2.AnimationDrawable anima = (AnimationDrawable)imageView.getBackground();    

3.anima.start(); //stop()是停止    

补间动画    

android使用Animation抽象类来定义动画,他有下面几个子类:TranslateAnimation AlphaAnimation  RotateAnimation ScaleAnimation。    只要为补间动画定义了三个必要的信息,android就会根据开始帧,结束帧,持续时间计算出中间还需要补入多少帧,并计算所有补入帧的图形。为了计算动画期间需要补入多少帧以及具体什么时间补帧,android引入了Interpolator配合补间动画,用来控制动画速度,这样就可以使动画以匀速,变速,抛物线速度等速度进行展示。    

Interpolator是一个接口,常见的有如下几个实现类,分别实现不同的动画变换速度。    AccelerateInterpolator :开始较慢,后面加速。    AccelerateDecelerateInterpolator ;开始和结束较慢,中间加速。    CycleInterpolator  :变换速度按正玄曲线。    DecelerateInterpolator 开始较快,然后开始减速。    LinearInterpolator :动画匀速变换。    一般都会使用资源文件来定义补间动画,这些定义可以写在资源文件中的android:interpolator属性里面,就像下面这样:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale android:fromXScale="1.0"
        android:toXScale="0.01"
        android:fromYScale="1.0"
        android:toYScale="0.01"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true"
        android:duration="3000" />
    <alpha android:fromAlpha="1.0"
        android:toAlpha="0.05"
        android:duration="3000" />

    <rotate android:fromDegrees="0"
        android:toDegrees="1800"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="3000" />
</set>
    补间动画的大致用法如下:
    1、在资源文件中定义补间动画;

    2、加载动画 Animation anim = AnimationUtils.loadAnimation(this, R.anim.xxx);

    animation.setFillAfter(true);

    或者在代码里面写: 

    TranslateAnimation anim = new TranslateAnimation(curX,nextX,curY,nextY);

    anim.setDuration(time);
    3、开启动画 imgview.startAnimation(anim);

    自定义补间动画
    自定义补间动画可以实现3D的效果,需要继承Animation并重写applyTransformation(float interpolatedTime, Transformation t)方法,这个两个参数说明如下:
    interpolatedTime:代表了动画的时间进行比,值的范围是0~1.
    Transformation:代表不同时刻对动画的变形程度,里面包装了Matrix(用getMatrix()即可得到),因此可以进行旋转,缩放,移动等操作。
    为了对图像或视图进行三维空间变换还需要使用到Camera类,作用类似于Matrix,但更加强大,其提供了如下常用的方法:
    save():
    restore():
    getMatrix(Matrix matrix):将Camera所做的变换应用到matrix上
    camera.translate(float x, float y, float z):在三维空间进行位移变换
    rotateX(float deg):沿着x轴旋转
    rotateY(float deg):
    rotateZ(float deg):
    applyToCanvas(Canvas canvas):将Camera所做的变换应用到canvas上
    android三维坐标系统如下图:

实现自定义补间动画的关键调用如下:
1、在继承Animation的类中
public MyAnimation(int x,int y,int d)
    {
        cX =x;
        cY = y;
        duration = d;
    }
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(duration);
        setFillAfter(true); //设置动画结束后效果保留
        setInterpolator(new LinearInterpolator());
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        camera.save();
        camera.translate(100 - 100 * interpolatedTime, 150 * interpolatedTime - 150, 80 - 80 * interpolatedTime);
        camera.rotateX(720 * interpolatedTime);
        camera.rotateZ(720 * interpolatedTime);
        Matrix matrix = t.getMatrix();
        camera.getMatrix(matrix);
        matrix.preTranslate(-cX, -cY);
        matrix.postTranslate(cX, cY);        
        camera.restore();
    }
2、在MainActivity中启动该动画即可
listView.setAnimation(new MyAnimation(screenWidth / 2, screenHeight / 2, 7000));

本文转载自:http://blog.csdn.net/wdong_love_cl/article/details/51385628

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
一个老鸟发的公司内部整理的 Android 学习路线图

一个老鸟发的公司内部整理的 Android 学习路线图 jixiaohua发了一篇。另一份 Android 开发学习路线图。可惜不是MarkDown格式的,所以jixiaohua直接上传的截图,在jixiaohua的呼吁下,我花了些...

2eggs
08/22
0
0
Android零基础入门第80节:Intent 属性详解(下)

上一期学习了Intent的前三个属性,本期接着学习其余四个属性,以及Android系统常用内置组件的启动。 四、Data和Type属性 Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri...

鑫鱻
2017/10/20
0
0
Android源码50例汇总,欢迎各位下载

下载中心好资料很多,藏在各个角落,小弟在此帮大家做了一个整理,做了一个下载目录,方便大家选择性下载。 源码实例如下: 《Android应用开发揭秘》源代码推荐 http://down.51cto.com/data...

程序袁_绪龙
2015/01/23
0
0
android悬浮窗、收款二维码、相机处理、事件通知库、NFC读取等源码

Android精选源码 一个漂亮而强大的自定义view SeekBar(http://www.apkbus.com/thread-598080-1-1.html) 适用于Android的简单NFC读取源码(http://www.apkbus.com/thread-598082-1-1.html) 安卓......

逆鳞龙
04/24
0
0
Android动画效果 translate、scale、alpha、rotate

Android的动画效果分为两种,一种是tweened animation(补间动画),第二种是frame by frame animation。 一般我们用的是第一种。补间动画又分为AlphaAnimation,透明度转换 RotateAnimation,...

黑马108
2012/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
32分钟前
4
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
3
0
使用 React 和 Vue 创建相同的应用,他们有什么差异?

在工作中应用 Vue 之后,我对它有了相当深刻的理解。 不过,俗话说「外国的月亮比较圆」,我好奇「外国的」 React 是怎么样的。 我阅读了 React 文档并观看了一些教程视频,虽然它们很棒,但...

阿K1225
昨天
4
0
2天闭门培训|以太坊智能合约从入门到实战(北京)

2天培训 16个课时 探寻技术原理,精通以太坊智能合约开发 以太坊智能合约是现在应用的最广泛的区块链应用开发方式,HiBlock区块链社区针对以太坊智能合约的学习特别推出2天闭门研修班,通过2...

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部