zoukankan      html  css  js  c++  java
  • 初探Android动画之门

    原文地址:http://www.cnblogs.com/kross/p/3376451.html

    最近自学了下动画的相关知识,总结为今天的文章,希望对大家有帮助。

    Android中的动画大致分为三种:逐帧动画视图动画属性动画

    1.逐帧动画

    这个动画效果是最简单的,也是非常容易实现的,原理就是,在一个ImageView上不断的切换显示的图片(当然也不一定是图片),来达到动画的效果,很明显,这样的实现方式和动漫,电影的原理是一样的。

    实现的过程是非常简单的,大致上是:

    准备每一帧的图像(可以是图片,也可以是通过xml定义的图形)。

    给ImageView设置drawable,设置动画属性即可。

    现在就来着手实现一下,在下打算做一个小圆形,由黑色逐渐变成白色的逐帧动画。

    我们可以通过<shape>来制作一些简单的图形。在/res/drawable/目录下新建xml文件命名为ball1.xml。代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        <solid 
            android:color="#000000"/>
        <size 
            android:width="100dp" 
            android:height="100dp" />
    </shape>

    依照上面这个步骤,响应的创建另外三个xml文件,一共是4个xml文件,分别是ball1.xml、ball2.xml、ball3.xml、ball4.xml。

    它们之间的区别就是颜色不断的变白。通过改变android:color属性就可以了。

    接下来,我们需要创建一个播放列表,来安排这4张图像的顺序与时长。

    创建/res/drawable/ball_list.xml文件,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
        android:visible="true"
        android:oneshot="true">
        <item
            android:drawable="@drawable/ball1"
            android:duration="250"/>
        <item
            android:drawable="@drawable/ball2"
            android:duration="250"/>
        <item
            android:drawable="@drawable/ball3"
            android:duration="250"/>
        <item
            android:drawable="@drawable/ball4"
            android:duration="250"/>
    </animation-list>

    android:oneshottrue的时候播放一遍就停止了。

    接下来,我们在activity_main.xml的布局中添加一个ImageView标签,给它的src属性设置为ball_list,代码如下:

    <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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
        <ImageView
            android:id="@+id/ball"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/ball_list"/>
    </RelativeLayout>

    最后一步,只需要在程序代码中写上如下的代码就可以让动画播放了。

    this.iv = (ImageView)findViewById(R.id.ball);
    
    this.iv.setOnClickListener(new OnClickListener() {
            
          @Override
          public void onClick(View v) {
               AnimationDrawable ad = (AnimationDrawable)iv.getDrawable();
               ad.stop();
               ad.start();
                    
          }
    });

    2.视图动画

    视图动画是在限定的属性集上对视图进行操纵的动画效果,但视图的真正属性并不会被修改,比如,通过视图动画放大了一个按钮的尺寸,但该按钮的响应范围还是原来那么大,它只是看上去变大了而已。因为这样的原因,本人并不是很看好这样的动画实现,Android3.0之后推出了属性动画,视图动画理所当然的被启用了,但对于还在使用Android3.0框架的设备,视图动画当然是必不可少的。

    视图动画可以操纵以下几个属性(或许说属性并不太正确)。

    Translate,移动视图

    Scale,缩放视图

    Rotate,旋转视图

    Alpha,视图的透明度

    我们可以将动画的定义写在xml里面,如下的代码:

    <?xml version="1.0" encoding="utf-8">
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:toYDelta="25%"
        android:toXDelta="25%"/>

    以上的动画在数值上是均匀变化的,如果需要一些特殊的数值变化,比如先快后慢,越来越快,之类的效果,可以使用插值器,这个东西就类似于给数值的变化曲线添加了一条曲线。

    在java代码中使用动画的时候使用如下代码就好:

    TextView tv = (TextView)findViewById(R.id.textview);
    Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide);

    以上就是视图动画的简单用法,我并没有过多的看方面的内容,所以介绍的不是很多。

    3.属性动画

    属性动画可以运行开发者直接修改任何对象的属性,使之形成动画,这可能会让一些不是视图的东西变得很古怪。但它非常强大,非常好用~强烈推荐!!(^o^)/~

    本文只介绍最好用的方法,我推荐使用ObjectAnimator对象,具体方法如下:

    View v = findViewById(R.id.my_view);
    ObjectAnimator oa = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f);
    oa.setDuration(500);
    oa.start();

    以上的代码,就会完成在500毫秒内,v这个视图由完全透明到完全不透明的变化过程,如果需要更好的数值变化效果,同样可以使用插值器。

    转载请注明出处:http://www.cnblogs.com/kross/p/3376451.html

    新浪微博:http://weibo.com/KrossFord

  • 相关阅读:
    leetcode56 合并区间(Medium)
    leetcode215 数组中的第k大元素(Medium)
    leetcode76 最小覆盖子串(Hard)
    leetcode75 颜色分类(Medium)
    leetcode64 最小路径和(Medium)
    Android 开发技巧
    Android 常用开源代码整理
    Android 屏幕尺寸知识
    Intellij IDEA 常用 设置 及 快捷键 (持续更新)
    Gradle Maven 依赖管理
  • 原文地址:https://www.cnblogs.com/kross/p/3376451.html
Copyright © 2011-2022 走看看