Mars视频笔记-Animation的使用

1.什么是Animations

  • Animations提供了一系列的动画效果,这些效果可以应用在绝大多数的控件.

2.Animations的分类

  • 代码中实现动画
  • xml中使用动画

总体分两大类

  • 第一类:Tweened Animations
    该类Animations提供了旋转,移动,伸展和淡出等等效果

  • 1.Alpha :淡入淡出效果

  • 2.Scale:缩放效果

  • 3.Rotate:旋转效果

  • 4.Translate:移动效果

  • 第二类:Frame-by-Frame Animations
    这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示;

  • 使用Tweened Animations 的步骤

1.创建一个AnimationSet对象
2.根据需要创建相应的Animation对象
3.根据软件动画的需求,为Animation对象设置相应的数据
4.将Animation对象添加到AnimationSet对象当中
5.使用空间对象开始执行AnimationSet

  • Tween Animation的通用属性

1.setDuration(long durationMils) 设置动画持续时间(单位毫秒)
2.setFillAfter(boolean fillAfter)
如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态
3.setFillBefore(boolean fillBefore)
如果fillBefore的值为true;则动画执行后,控件将回到动画执行之前的状态;
4.setStartOffset(long startOffSet)
设置动画执行之前的等待时间
5.setRepeatCount(int repearCount)
设置动画重复执行的次数

Paste_Image.png
(在代码中实现动画)实例代码:

<pre><code>package mars.animations01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ImageView imageView = null;
private Button rotateButton = null;
private Button scaleButton = null;
private Button alphaButton = null;
private Button translateButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageViewId);
rotateButton = (Button) findViewById(R.id.rotateButtonId);
rotateButton.setOnClickListener(new RotateButtonListener());
scaleButton = (Button) findViewById(R.id.scaleButtonId);
scaleButton.setOnClickListener(new ScaleButtonListener());
alphaButton = (Button) findViewById(R.id.alphaButtonId);
alphaButton.setOnClickListener(new AlphaButtonListener());
translateButton = (Button) findViewById(R.id.translateButtonId);
translateButton.setOnClickListener(new TranslateButtonListener());
}
private class RotateButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_PARENT, 1f,
Animation.RELATIVE_TO_PARENT, 0f);
rotateAnimation.setDuration(5000);
animationSet.addAnimation(rotateAnimation);
imageView.startAnimation(animationSet);
}
}
private class ScaleButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 1, 0.1f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
animationSet.addAnimation(scaleAnimation);
animationSet.setStartOffset(1000);
animationSet.setFillAfter(true);
animationSet.setFillBefore(false);
animationSet.setDuration(2000);
imageView.startAnimation(animationSet);
}
}
private class AlphaButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
//创建一个AnimationSet对象
AnimationSet animationSet = new AnimationSet(true);
//创建一个AlphaAnimation对象
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
//设置动画执行的时间(单位:毫秒)
alphaAnimation.setDuration(1000);
//将AlphaAnimation对象添加到AnimationSet当中
animationSet.addAnimation(alphaAnimation);
//使用ImageView的startAnimation方法开始执行动画
imageView.startAnimation(animationSet);
}
}
private class TranslateButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 1.0f);
translateAnimation.setDuration(1000);
animationSet.addAnimation(translateAnimation);
imageView.startAnimation(animationSet);
}
}
}</pre></code>

(在xml文件中实现):
首先需要在res文件夹下新建anim文件夹
然后可以在anim文件夹中新建xml文件
alpha.xml

 <?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@android:anim/accelerate_interpolator">
         <alpha 
      android:fromAlpha="1.0"
      android:toAlpha="0.0"
      android:startOffset="500"
      android:duration="500" />

 </set>

rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="5000" />
</set>
  1. android:pivotX="50" 这种方法是用绝对位置定位;
  2. android:pivotX="50%"这种方法相对于控件本身定位;
  3. android:pivotX="50%p"这种方法相对于控件的父控件定位

scale.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<scale android:fromXScale="1.0" 
    android:toXScale="0.0"
    android:fromYScale="1.0" 
    android:toYScale="0.0" 
    android:pivotX="50%"
    android:pivotY="50%" 
    android:duration="2000" />
</set>

translate.xml

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

如何在java代码中使用anim:
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha); imageView.startAnimation(animation);

AnimationSet的使用方法

什么是AnimationSet

1.AnimationSet是Animation的子类,可以整合各种动画效果
2.一个AnimationSet包含了一系列的Animation
3.针对AnimationSet设置一些Animation的常见属性,可以被包含在AnimationSet当中的Animation集成

实例,实现渐变和旋转

public class MainActivity extends Activity {
private Button button = null;
private ImageView imageView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    imageView = (ImageView) findViewById(R.id.imageViewId);
    button = (Button) findViewById(R.id.scaleButtonId);
    button.setOnClickListener(new AnimationButtonListener());
}

private class AnimationButtonListener implements OnClickListener {

    @Override
    public void onClick(View v) {
        /**
         * Animation animation =
         * AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
         * imageView.startAnimation(animation);
         */
        // 声明一个AnimationSet对象
        AnimationSet animationSet = new AnimationSet(false);
        //false 设置android:shareInterpolator为false,true设置android:shareInterpolator为true
        //animationSet.setInterpolator(new AccelerateInterpolator());
        AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
        alpha.setInterpolator(new DecelerateInterpolator());
        RotateAnimation rotate = new RotateAnimation(0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setInterpolator(new AccelerateInterpolator());
        animationSet.addAnimation(alpha);
        animationSet.addAnimation(rotate);
        animationSet.setDuration(2000);
        animationSet.setStartOffset(500);
        imageView.startAnimation(animationSet);
    }

}
}

Interpolator 的使用方法-控制动画使用效果(ex:前慢后快)

Interpolator定义了动画变化的速率,在Animations框架当中定义了以下几种

Interpolator

  • AccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速
  • CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速
  • LinearInterpolator:动画以均匀的速率改变
    在xml文件中设置Interpolator


    Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
    
<alpha 
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:startOffset="500"
    android:duration="2000" />

<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="2000" />
</set>

如果shereInterpolator= "false" 则需要对AnimationSet中的每一个动画设置Interpolator属性

Frame-By-Frame Animations的使用方法

在res/drawable当中创建一个xml文件,用于定义Animations的动画序列

<?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/nv1" android:duration="500" />
<item android:drawable="@drawable/nv2" android:duration="500" />
<item android:drawable="@drawable/nv3" android:duration="500" />
<item android:drawable="@drawable/nv4" android:duration="500" />
</animation-list>

使用方法

1.为imageView设置背景资源
imageView.setBackgroundResource(R.drawable.anim_nv);
2.通过ImageView得到AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();
3.开始执行动画
animationDrawable.start();

LayoutAnimationController的使用方法

  • 什么是LayoutAnimationController

    1. LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果;

    2.每一个控件都有相同的动画效果
    3.这些控件的动画效果在不同的时间显示出来
    4.LayoutAnimationController可以在xml文件当中设置,也可以在代码当中进行设置。

在xml文件中使用LayoutAnimationController
在anim文件夹下创建一个新文件,名为list_anim_layout.xml文件

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="2"
android:animationOrder="normal" //有三个值random,normal,reverse
android:animation="@anim/list_anim" />

list_anim.xml文件

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

main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical" 
    android:layoutAnimation="@anim/list_anim_layout"
    //当在代码中使用LayoutAnimationController时,去掉此属性
    />

<Button
    android:id="@+id/buttonId"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="测试" />

</LinearLayout>

代码中使用LayoutAnimationController

1.创建一个Animation对象
2.使用如下代码创建LayoutAnimationController对象:
LayoutAnimationController lac = new LayoutAnimationController(animation);
3.设置控件显示的顺序:
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
4.为ListView设置LayoutAnimationController属性
listView.setLayoutAnimation(lac);

Animation animation = (Animation) AnimationUtils.loadAnimation(
                MainActivity.this, R.anim.list_anim);
        LayoutAnimationController lac = new LayoutAnimationController(
                animation);
        lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
        lac.setDelay(0.5f);
        listView.setLayoutAnimation(lac);

AnimationListenter的使用方法

1.AnimationListenter是一个监听器
2.该监听器在动画执行的各个阶段会得到通知,而调用相应的方法
3.主要包含以下的三个方法

1.onAnimationEnd(Animation animation)
2.onAnimationRepeat(Animation animation)
3.onAnimationStart(Animation animation)

代码示例:
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private Button removeButton = null;
private Button addButton = null;
private ImageView imageView = null;
private ViewGroup viewGroup = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    removeButton = (Button) findViewById(R.id.removeButtonId);
    imageView = (ImageView) findViewById(R.id.imageViewId);
    removeButton.setOnClickListener(new RemoveButtonListener());
    viewGroup = (ViewGroup) findViewById(R.id.layoutId);
    addButton = (Button) findViewById(R.id.addButtonId);
    addButton.setOnClickListener(new AddButtonListener());
}

private class AddButtonListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        // 创建了一个淡入效果的Animation对象
        AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(1000);
        animation.setStartOffset(500);
        // 创建一个新的ImageView
        ImageView imageViewAdd = new ImageView(MainActivity.this);
        imageViewAdd.setImageResource(R.drawable.icon);
        // 将新的ImageView添加到viewGroup当中
        viewGroup.addView(imageViewAdd, new LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        // 启动动画
        imageViewAdd.startAnimation(animation);
    }

}

private class RemoveButtonListener implements OnClickListener {

    @Override
    public void onClick(View v) {
        // 创建一个淡出效果的Animation对象
        AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
        // 为Animation对象设置属性
        animation.setDuration(1000);
        animation.setStartOffset(500);
        // 为Animation对象设置监听器
        animation.setAnimationListener(new RemoveAnimationListener());
        imageView.startAnimation(animation);
    }
}

private class RemoveAnimationListener implements AnimationListener {
    // 该方法在淡出效果执行结束之后被调用
    @Override
    public void onAnimationEnd(Animation animation) {
        System.out.println("end");
        // 从viewGroup当中删除掉imageView控件
        viewGroup.removeView(imageView);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        System.out.println("repeat");
    }

    @Override
    public void onAnimationStart(Animation animation) {
            System.out.println("start");
    }

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,053评论 25 707
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,705评论 0 10
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,092评论 1 23
  • 在想你的瞬间 目光停留 在思念的片刻 感情泛滥 炙热的夏日 是你 在引燃着我深藏的感情 蒸腾的云烟 是你 在渲染着...
    bab87461adbd阅读 602评论 1 14
  • 姥爷病了,第一次听到妈妈声音的疲惫,这让我有些惶恐。毕竟以后可能不会再有一点点期待了吧。 总是以为妈妈在什么都好了...
    夏同恩阅读 209评论 0 0