android动画

动画分类

  • 变换动画Tween
  • 布局动画Layout
  • 帧动画Frame
  • 属性动画Property

Annimation 动画使用方式

1 配置文件方式 /res/anim – alpha,scale, translate,rotate
使用的时候加载文件AnimationUtils.loadAnimation :

 Animation scale = AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale_anim);
 img.startAnimation(scale);

2 java代码方式 AlphaAnimation ScaleAnimation, TranslateAnimation , RotateAnimation
当一些参数需要计算, 动态确定 , 就使用代码方式, 否则使用配置文件方式

Animation alpha = new AlphaAnimation(0.1f, 1.0f);
alpha.setDuration(5000);
img.startAnimation(alpha);

Tween Animation 动画

Tween Animation:变换动画分类:
- alpha渐变透明度动画
- scale渐变尺寸动画
- translate位置移动动画
- rotate旋转动画

Tween Animation 共同属性

Duration: 动画持续时间毫秒
fillAfter: true的话 动画转化在动画结束后被应用
fillBefore: true的话 动画转化在动画开始前被应用
interpolator: 动画插入器 加速,减速插入器
repeatCount: 动画重复次数
repateMode: 顺序重复/倒序重复
startOffset: 动画之间的时间间隔

透明度动画

常用属性:
fromAlpha 动画起始透明度
toAlpha 终止时透明度

xml文件方式示例:

//Activity

        case R.id.alpha: {      
            loadAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
            image.startAnimation(loadAnimation);
            break;
        }

//alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <alpha
        android:duration="1000"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" >
    </alpha>

</set>

缩放动画 ScaleAnimation

常用属性:
fromX,toX x坐标伸缩尺寸
fromY,toY Y坐标伸缩尺寸
pivoX,pivoY 伸缩动画相对于,x,y坐标开始的位置

        case R.id.scale: {
            loadAnimation = AnimationUtils.loadAnimation(this, R.anim.scale);
            image.startAnimation(loadAnimation);
            break;
        }
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <scale
        android:duration="2000"
        android:fillAfter="false"           //动画完成后是否保持最后的状态, false不保存, 即回到原本状态
        android:fromXScale="0.0"
        android:fromYScale="0.0"
                                //动画插入器, 先加速后减速
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"   
        android:pivotX="50%"            //设置缩放中心 , 为中心点
        android:pivotY="50%"            //设置缩放中心 , 为中心点
        android:toXScale="1.0"
        android:toYScale="1.0" />

</set>

位移动画

常用属性:
fromXdelta , fromYDelta 起始X,Y
toXDelta, toYDelta 结束时X,Y

        case R.id.translate: {

            loadAnimation = AnimationUtils
                    .loadAnimation(this, R.anim.translate);
            image.startAnimation(loadAnimation);
            break;
        }
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="1000"
        android:fromXDelta="10"
        android:fromYDelta="10"
        android:toXDelta="100"
        android:toYDelta="100" />

</set>

RotateAnimation 旋转动画

常用属性:
fromDegree 起始角度
toDegree 终止角度
pivotX,pivotY 旋转中心点

        case R.id.rotate: {
            loadAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
            image.startAnimation(loadAnimation);
            break;
        }
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        // 先加速后减速
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+360" />

</set>

组合动画

设置 AnimationListener

例1: 先动画A , 设置A的AnimationListener , 当onAnimationEnd触发(即A播放完毕)时, 开始播放B.

        case R.id.continue_btn: {
            loadAnimation = AnimationUtils
                    .loadAnimation(this, R.anim.translate);
            image.startAnimation(loadAnimation);
            //结束时准备调用的动画, 要在回调中使用, 所以要设置为final
            final Animation loadAnimation2 = AnimationUtils.loadAnimation(this,
                    R.anim.rotate);
            loadAnimation.setAnimationListener(new AnimationListener() {
                @Override
                public void onAnimationStart(Animation arg0) {
                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                }

                @Override
                public void onAnimationEnd(Animation arg0) {
                    // TODO Auto-generated method stub
                    image.startAnimation(loadAnimation2);
                }
            });
            break;
        }

动画集 AnimationSet

例2: 使用动画集 AnimationSet ,其中定义动画A, B 为动画B设置startOffset , 其值为前一个动画播放所需要的时间
//startOffset 动画延迟时间
//Activity

        case R.id.continue_btn2: {
            loadAnimation = AnimationUtils.loadAnimation(this,
                    R.anim.continue_anim);
            image.startAnimation(loadAnimation);
            break;
        }

//continue_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <alpha
        android:duration="3000"
        android:fromAlpha="0.2"
        android:toAlpha="1.0" />
    <alpha
        android:duration="3000"
        android:fromAlpha="1.0"
        // 上一个动画duration 3秒, 这里设置startOffset 延迟3秒, 于是实现了连续播放, 组合动画
        android:startOffset="3000"  
        android:toAlpha="0.2" />

</set>

setRepeatCount , setRepeatMode

例3: 循环闪烁 利用Animation 的setRepeatCount, setRepeatMode来实现动画循环
使用透明度动画循环

        case R.id.flash: {

            AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
            alphaAnimation.setDuration(100);
            alphaAnimation.setRepeatCount(10);
            // 倒序重复REVERSE 正序重复RESTART
            alphaAnimation.setRepeatMode(Animation.REVERSE);
            image.startAnimation(alphaAnimation);

            break;
        }

overridePendingTransition 方法 Activity切换动画

例4: Activity切换动画, 使用overridePendingTransition方法
参数1: 第二个activity 进入动画配置文件
参数2: 第一个activity退出动画配置文件

        case R.id.change: {
            Intent intent = new Intent(MainActivity.this, MainActivity2.class);
            startActivity(intent);
            //第一个参数指定新启动的activity由小变大zoom_in , 
            //第二个参数指定当前activity 由大变小zoom_out
            overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out);
            break;
        }

//zoom_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator" >

  <scale
        android:duration="1000"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />
  <alpha
        android:duration="1000"
        android:fromAlpha="0"
        android:toAlpha="1.0" />
</set>

//zoom_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:zAdjustment="top" >

    <scale
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%p"
        android:pivotY="50%p"
        android:toXScale="0.1"
        android:toYScale="0.1" />

    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0" />

</set>

布局动画 Layout Animation

为View Groups 添加动画
使用LayoutAnimationController , 来加载动画,应用到layout下每一个子view

例子中 R.anim.zoom_in和上面使用的是同样的文件

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
        listView=(ListView) findViewById(R.id.listView);
        List<String>list=new ArrayList<String>();
        for(int i=0;i<20;i++)
        {
            list.add("测试数据"+i);
        }
        ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(adapter);
        //生成布局动画控制器, 并加载动画
        LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in));
        //设置动画顺序
        lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
        // 应用动画
        listView.setLayoutAnimation(lac);
        listView.startLayoutAnimation(); //按设置, 对子view动画依次播放
    }

逐帧动画 FrameAnimation

drawable下建xml文件, 用animation-list标签(item标签集合),
一个item标签定义要显示的drawable下图片(帧图),且指定显示它的时间(毫秒为单位), 如
//anim_list.xml , “@drawable/one” ,”@drawable/two” 这些都是准备好的图片 , 每幅图片停留时间为500毫秒

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/one"
        android:duration="500"/>
    <item
        android:drawable="@drawable/two"
        android:duration="500"/>
    <item
        android:drawable="@drawable/three"
        android:duration="500"/>
    <item
        android:drawable="@drawable/four"
        android:duration="500"/>
    <item
        android:drawable="@drawable/five"
        android:duration="500"/>
    <item
        android:drawable="@drawable/six"
        android:duration="500"/>

</animation-list>

//使用该动画, 逐帧动画
逐帧动画 除start外还有一些控制方法 可参考:
http://www.cnblogs.com/plokmju/p/android_AnimationDrawable.html

        case R.id.frame: {
            //直接只是加载动画图片 setImageResource 到ImageView,  在很多情况下动画不会运行, 必须先生成AnimationDrawable对象
//          image.setImageResource(R.drawable.anim_list);

            AnimationDrawable aniDrawable = null ;
            /*  方法1: 
//          aniDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_list);
//          image.setBackground(aniDrawable);    
            aniDrawable.start();
            */

            // 方法2:
            image.setImageResource(R.drawable.anim_list); 
            aniDrawable = (AnimationDrawable) image.getDrawable();
            aniDrawable.start();
            break;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值