【安卓学习笔记】安卓动画的实现(1)——补间动画(Tween)

安卓动画分类

动画分类

安卓动画分为图中所示4大类。
所谓帧动画,即准备很多图片,让图片按一定时间连续播放,从而达到模拟动画效果。而补间动画则是对单个帧进行渐变操作。通俗的理解,它可以对单张图片进行5种操作:透明度、位移、旋转、缩放以及上面四种操作的组合操作。这比帧动画要节省资源。
本节介绍补间动画。先看效果。

效果

补间动画有两种实现方式——资源文件中配置动画效果、java代码实现。
资源文件中配置适用于固定动画,java代码实现比较灵活。

步骤

资源文件中实现:
  • res/anim文件夹中创建动画配置文件
  • activity中,AnimationUtils.loadAnimation加载该配置文件
  • startAnimation开启动画
java代码中实现:
  • 使用new alphaAnimation/RotateAnimation/TranslateAnimation /ScaleAnimation ,创建一个animation对象
  • 再使用该对象的setDuration、setInterpolator等方法设置动画效果
  • startAnimation开启动画

源码

1、activity的布局文件

<LinearLayout 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:orientation="vertical"          
    tools:context=".MainActivity">

    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="alpha动画"
        android:id="@+id/btn_alpha"
        android:onClick="click"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="scale动画"
        android:id="@+id/btn_scale"
        android:onClick="click"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="translate动画"
        android:id="@+id/btn_translate"
        android:onClick="click"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="rotate动画"
        android:id="@+id/btn_rotate"
        android:onClick="click"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="set动画(上面动画的组合)"
        android:id="@+id/btn_set"
        android:onClick="click"/>

    <ImageView
        android:id="@+id/image"        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:layout_marginTop="30dip"
        android:layout_gravity="center_horizontal"/>
   
</LinearLayout>

2、MainActivity

public class MainActivity extends Activity {

    private Button btn_scale, btn_rotate, btn_translate, btn_alpha, btn_set;
    private ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();

    }

    private void bindViews() {
        btn_alpha = (Button) findViewById(R.id.btn_alpha);
        btn_rotate = (Button) findViewById(R.id.btn_rotate);
        btn_scale = (Button) findViewById(R.id.btn_scale);
        btn_translate = (Button) findViewById(R.id.btn_translate);
        btn_set = (Button) findViewById(R.id.btn_set);
        image = (ImageView) findViewById(R.id.image);
    }

    public void click(View view) {

        switch (view.getId()) {

        case R.id.btn_alpha:
            /** 资源文件中实现方式 **/
            /*
             * Animation alpha = AnimationUtils.loadAnimation(this,
             * R.anim.anim_alpha); image.startAnimation(alpha);
             */

            /** java代码中实现方式 **/
            Animation alpha = new AlphaAnimation(0.1f, 1);
            alpha.setDuration(2000);
            image.startAnimation(alpha);

            break;
        case R.id.btn_rotate:
            /** 资源文件中实现方式 **/
            /*
             * Animation rotate = AnimationUtils.loadAnimation(this,
             * R.anim.anim_rotate); image.startAnimation(rotate);
             */

            /** java代码中实现方式 **/
            Animation rotate = new RotateAnimation(0, 360);
            rotate.setDuration(2000);
            image.startAnimation(rotate);
            break;
        case R.id.btn_scale:
            /** 资源文件中实现方式 **/
            /*
             * Animation scale = AnimationUtils.loadAnimation(this,
             * R.anim.anim_scale); image.startAnimation(scale);
             */

            /** java代码中实现方式 **/
            Animation scale = new ScaleAnimation(0, 1, 0, 1);
            scale.setDuration(2000);
            image.startAnimation(scale);

            break;
        case R.id.btn_translate:
            /** 资源文件中实现方式 **/
            /*
             * Animation translate = AnimationUtils.loadAnimation(this,
             * R.anim.anim_translate); image.startAnimation(translate);
             */

            /** java代码中实现方式 **/
            Animation translate = new TranslateAnimation(0, 100, 0, 0);
            translate.setDuration(2000);
            image.startAnimation(translate);

            break;
        case R.id.btn_set:
            Animation set = AnimationUtils.loadAnimation(this, R.anim.anim_set);
            image.startAnimation(set);

            break;

        }

    }

}

3、res/anim资源文件中动画配置文件

anim_alpha.xml

android:interpolator为插值器,可设置动画的速度效果。如这里的@android:anim/accelerate_decelerate_interpolator表示先加速后减速。fromAlpha开始时透明度为1.0,即不透明。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:duration="2000"/>
</set>
anim_scale.xml

fromXScale开始时x轴缩放尺寸,toXScale结束时缩放尺寸。这里从1.0到0.0表示x轴方向图片由100%比例缩小到0。pivotX表示缩放中心点,50%表示以图形中心为缩放中心点。duration动画时间,单位毫秒。

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale 
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.0"
        android:toYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000"/>
</set>
anim_rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate 
        android:fromDegrees="0"
        android:toDegrees="360"
        android:duration="2000"
        android:pivotX="50%"
        android:pivotY="50%"/>

</set>
anim_translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100"
        android:toYDelta="100"
        android:duration="2000"/>

</set>
anim_set.xml

组合动画,只需在set标签中,把上述4中或任意的多种放进去即可。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    
    <alpha android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:duration="2000"/>
    
     <scale 
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.0"
        android:toYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000"/>
     
     <rotate 
        android:fromDegrees="0"
        android:toDegrees="360"
        android:duration="2000"
        android:pivotX="50%"
        android:pivotY="50%"/>
     
     <translate 
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100"
        android:toYDelta="100"
        android:duration="2000"/>

</set>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容